这是一个头文件
#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));
}
所以至少对我来说这是非常复杂的。想法是在主函数中我将调用单个(x),其中x = 4,因此它更像单个(4),它将调用双精度(3),这将调用三元组(2),它将调用所有将返回0的单曲(1),返回0的双精度(1)和将返回m的三元组(1)。
所以我得到的错误是
./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脚本,我尝试编译它不会工作。我尝试导入标头以尽量避免此错误但它似乎不起作用。 非常感谢
答案 0 :(得分:9)
在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
答案 1 :(得分:3)
术语&#34;隐含声明&#34;在错误消息中通常是在编译器在声明(原型)之前看到对函数的调用的实现时生成的。
例如,你应该有:
头文件
int singles(int x);
int doubles(int x);
int triples(int x);
在您的源文件中:
#include "header_file.h"
此外,在函数定义(实现)中,您需要指定参数的类型:
int singles (/* data type */ parameter_name)
{
//...
}
编辑1:将实现更改为@John Bollinger的函数调用。