警告:隐式函数声明
我的编译器(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,你将会得到这个错误