警告:隐式函数声明在C99中无效?

警告:隐式函数声明在C99中无效?

问题描述:

这是一个头文件警告:隐式函数声明在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

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 

编译器看到当在错误消息中的术语“隐式声明”通常产生的声明(原型)之前的函数的调用的执行。

例如,你应该有:
头文件

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:“隐式定义”发生在编译器在任何被调用的函数声明之前看到一个函数*调用*(不是实现)。 –