这是一个头文件

#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));
}

所以这至少对我来说很复杂。我的想法是在主函数中我将调用singles(x),其中x = 4,所以它更像singles(4),它将调用doubles(3),这将调用三元组(2),将调用所有将返回0的单打(1),双元组(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参数的类型。

您需要指定函数原型(prototype),这些原型(prototype)在不定义函数的情况下声明了函数:

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

另外,您不应该在头文件中定义函数。如果将此头文件包含在多个.c文件中,然后将它们链接在一起,则会出现错误,因为您将对这些函数有多个定义。

提取所有函数定义,并将其放入test.c。然后在test.h中,仅将原型(prototype)放在上面。然后,您可以按如下所示编译所有内容:
gcc -c test.c
gcc -c main.c
gcc -o main main.o test.o

或一行:
gcc -o main test.c main.c

关于c - 警告: implicit declaration of function is invalid in C99?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33110645/

10-15 06:10