2015-10-13 160 views
1

這是一個頭文件警告:隱式函數聲明在C99中無效?

#include <stdio.h> 

int m = 18; 
int x = 4; 

int singles (n) { 
    if (n == 1) 
     return 0; 
    return doubles(n-1); 
} 

int doubles (n) { 
    if (n == 1) 
     return 0; 

    return triples(n-1); 
} 

int triples (n) { 
    if (n == 1) 
     return m; 

    return (singles(n-1) + doubles (n-1) + triples (n-1))*(m-1); 
} 

,這是主要的文件

#include <stdio.h> 
#include "test.h" 

int main() { 
    printf("%d",singles (x)); 
} 

所以這是非常複雜,我在-least.The的想法是,在主函數中我會打電話單打(x)其中x = 4因此它更像單打(4),它將調用雙打(3),這將調用三元組(2),這將調用所有單打(1),這將返回0,雙打(1)返回0和三元組(1)將返回m。

,所以我得到的錯誤是

./test.h:13:12: warning: implicit declaration of function 'doubles' is invalid 
     in C99 [-Wimplicit-function-declaration] 
    return doubles(n-1); 
    ^
./test.h:20:12: warning: implicit declaration of function 'triples' is invalid 
     in C99 [-Wimplicit-function-declaration] 
    return triples(n-1); 
    ^
2 warnings generated. 

我試圖創建的第一個腳本頭文件的.h,然後做了第二次.c的腳本,我嘗試編譯將無法工作。我試圖導入標題,以儘量避免這個錯誤,但它似乎並沒有工作。 非常感謝

+2

高度懷疑這與C,C++,*和* C#。請只標記真正涉及的語言(在這種情況下,似乎只有C)。 – crashmstr

+2

你爲什麼要標記'c#'這個問題? – Eser

+0

對不起,我對編碼很陌生,以爲他們是同一件事。 – Charana

回答

6

singles的內部,您在定義之前使用doubles。同樣在doubles中,您在定義之前使用了triples。這就是爲什麼你會得到隱含的聲明錯誤。

此外,您沒有將n參數的類型定義爲這些函數中的任何一個。

,需要在不定義它指定函數原型,其聲明函數:

int singles(int n); 
int doubles(int n); 
int triples(int n); 

而且,你不應該在頭文件中定義的功能。如果您將此頭文件包含在多個.c文件中,然後將它們鏈接在一起,則會出現錯誤,因爲您將具有這些函數的多個定義。

把所有的函數定義放到test.c中。然後在test.h中,只放上面的原型。然後,你可以按照如下編譯:

gcc -c test.c 
gcc -c main.c 
gcc -o main main.o test.o 

或者在單行:

gcc -o main test.c main.c 
3

編譯器看到當在錯誤消息中的術語「隱式聲明」通常產生的聲明(原型)之前的函數的調用的執行。

例如,你應該有:
頭文件

int singles(int x); 
int doubles(int x); 
int triples(int x); 

在源文件:

#include "header_file.h" 

而且,在你的函數定義(實現),你需要指定的類型參數:

int singles (/* data type */ parameter_name) 
{ 
//... 
} 

編輯1:更改d實現到每個@John Bollinger的函數調用。

+0

感謝您的輸入,並沒有解決我的問題tho.thanks反正 – Charana

+1

你misspoke:「隱式定義」發生在編譯器在任何被調用的函數聲明之前看到一個函數*調用*(不是實現)。 –

相關問題