我的编译器(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
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 }
如果你定义了正确的头文件&当遇到诸如malloc_trim之类的GNU扩展时,gcc也会抛出error: implicit declaration of function。
malloc_trim
gcc
error: implicit declaration of function
解决方案是包装分机&头:
#if defined (__GLIBC__) malloc_trim(0); #endif
man 2 functionname
SYNOPSIS
你正在使用一个编译器没有看到的函数
我认为这个问题并没有百分之百的答案。我正在寻找缺少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__()代替。gcc ... -Dtypeof=__typeof__ ...也有帮助。
__typeof__()
gcc ... -Dtypeof=__typeof__ ...
#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列表,只是顺序不同。
对我来说确实如此。
你需要在主要函数之前声明你想要的函数:
#include <stdio.h> int yourfunc(void); int main(void) { yourfunc(); }
不要忘记,如果函数中调用了任何函数,它们的原型必须位于代码中函数的上方。否则,编译器在尝试编译函数之前可能找不到它们。这将产生问题中的错误。
GNU C编译器告诉您,它可以在程序作用域中找到特定的函数名。尝试在头文件中将其定义为私有原型函数,然后将其导入到主文件中。