警告:隐式函数声明

我的编译器(GCC)给了我警告:

警告:隐式函数声明

请帮我理解为什么会这样。

您正在使用编译器尚未看到声明(“ 原型 ”)的函数。

例如:

int main() { fun(2, "21"); /* The compiler has not seen the declaration. */ return 0; } int fun(int x, char *p) { /* ... */ } 

你需要在main之前声明你的函数,就像这样,直接或者在头文件中:

 int fun(int x, char *p); 

正确的方法是在头中声明函数原型。

main.h

 #ifndef MAIN_H #define MAIN_H int some_main(const char *name); #endif 

main.c中

 #include "main.h" int main() { some_main("Hello, World\n"); } int some_main(const char *name) { printf("%s", name); } 

另一个文件(main.c)

 static int some_main(const char *name); int some_main(const char *name) { // do something } 

当你在main.c中执行#include时,把#include引用放在include列表顶部包含被引用函数的文件中。 例如说这是main.c,你引用的函数在“SSD1306_LCD.h”

 #include "SSD1306_LCD.h" #include "system.h" #include <stdio.h> #include <stdlib.h> #include <xc.h> #include <string.h> #include <math.h> #include <libpic30.h> // http://microchip.wikidot.com/faq:74 #include <stdint.h> #include <stdbool.h> #include "GenericTypeDefs.h" // This has the 'BYTE' type definition 

以上将不会生成“隐式函数声明”错误,但是下面将会 –

 #include "system.h" #include <stdio.h> #include <stdlib.h> #include <xc.h> #include <string.h> #include <math.h> #include <libpic30.h> // http://microchip.wikidot.com/faq:74 #include <stdint.h> #include <stdbool.h> #include "GenericTypeDefs.h" // This has the 'BYTE' type definition #include "SSD1306_LCD.h" 

完全一样的#include列表,只是不同的顺序。

那么,它为我做了。

如果你已经定义了正确的头文件并且正在使用一个非GlibC库(比如Musl C ),那么gcc也会抛出error: implicit declaration of function当遇到像malloc_trim这样的GNU扩展时, error: implicit declaration of function

解决方案是包装扩展名和标题 :

 #if defined (__GLIBC__) malloc_trim(0); #endif 

当你得到error: implicit declaration of function它也应该列出违规函数。 通常这个错误是由于头文件被遗忘或缺失而发生的,所以在shell提示符下你可以输入man 2 functionname并查看顶部的SYNOPSIS部分,因为这部分将列出需要包含的头文件。 或者尝试http://linux.die.net/man/这是在线手册页,他们超链接,易于搜索。; 函数经常在头文件中定义,包括任何需要的头文件往往是答案。 像cnicutar说的,

您正在使用编译器尚未看到声明(“原型”)的函数。

我认为这个问题不是100%的回答。 我正在寻找缺少typeof()的问题,这是编译时指令。

以下链接将会照亮情况:

https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Typeof.html

https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Alternate-Keywords.html#Alternate-Keywords

作为__typeof__()尝试使用__typeof__()来代替。 还gcc ... -Dtypeof=__typeof__ ...可以帮助。

如果忘记包含头文件,也会发生这种情况。 例如,如果你正在尝试使用strlen()而不包含string.h,你将会得到这个错误