我的编译器(GCC)向我发出警告:
警告:函数的隐式声明
为什么会来?
您正在使用编译器尚未看到其声明(“prototype”)的函数。
例如:
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 时,将对包含引用函数的文件的引用放在包含列表的顶部。 例如假设这是 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 列表,只是顺序不同。
嗯,对我来说确实如此。
您需要在 main 函数之前声明所需的函数:
#include <stdio.h>
int yourfunc(void);
int main(void) {
yourfunc();
}
当您获得
error: implicit declaration of function
时,它还应该列出有问题的函数。通常,由于忘记或丢失头文件而发生此错误,因此在 shell 提示符下,您可以键入 man 2 functionname
并查看顶部的 SYNOPSIS
部分,因为此部分将列出需要包含的所有头文件。或者尝试 http://linux.die.net/man/ 这是在线手册页,它们带有超链接并且易于搜索。
函数通常在头文件中定义,包括任何所需的头文件通常就是答案。正如 cnicutar 所说,
您正在使用编译器尚未识别的函数 声明(“原型”)尚未。
不要忘记,如果您的函数中调用了任何函数,那么它们的原型必须位于代码中您的函数之上。否则,编译器在尝试编译您的函数之前可能无法找到它们。这将产生相关错误。
出现此错误是因为您尝试使用编译器无法理解的函数。如果您尝试使用的函数是用 C 语言预定义的,则只需包含与隐式函数关联的头文件即可。 如果它不是预定义函数,那么在主函数之前声明该函数始终是一个好习惯。
我认为这个问题没有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__()
代替。 gcc ... -Dtypeof=__typeof__ ...
也可以提供帮助。
GNU C 编译器告诉您它可以在程序范围内找到特定的函数名称。尝试在头文件中将其定义为私有原型函数,然后将其导入到主文件中。