警告:C99中隐式声明功能无效?

时间:2015-10-13 19:03:52

标签: c

这是一个头文件

#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脚本,我尝试编译它不会工作。我尝试导入标头以尽量避免此错误但它似乎不起作用。 非常感谢

2 个答案:

答案 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的函数调用。