警告:隐式函数声明在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的脚本,我尝试编译将无法工作。我试图导入标题,以尽量避免这个错误,但它似乎并没有工作。 非常感谢
在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的函数调用。
感谢您的输入,并没有解决我的问题tho.thanks反正 – Charana
你misspoke:“隐式定义”发生在编译器在任何被调用的函数声明之前看到一个函数*调用*(不是实现)。 –
高度怀疑这与C,C++,*和* C#。请只标记真正涉及的语言(在这种情况下,似乎只有C)。 – crashmstr
你为什么要标记'c#'这个问题? – Eser
对不起,我对编码很陌生,以为他们是同一件事。 – Charana