消息“警告:隐式函数声明”;

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

警告:函数的隐式声明

它为什么会来?

1017306 次浏览

你正在使用一个编译器还没有看到声明("原型")的函数。

例如:

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

解决方案是包装分机&头:

#if defined (__GLIBC__)
malloc_trim(0);
#endif
当你得到error: implicit declaration of function时,它也应该列出出错的函数。通常发生这种错误是因为头文件被遗忘或丢失,所以在shell提示符下,你可以输入man 2 functionname并查看顶部的SYNOPSIS部分,因为该部分将列出需要包含的所有头文件。或者尝试http://linux.die.net/man/这是在线手册页,它们是超链接的,很容易搜索。 函数通常在头文件中定义,包括任何所需的头文件通常是答案。就像cnicutar说的,

你正在使用一个编译器没有看到的函数

我认为这个问题并没有百分之百的答案。我正在寻找缺少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__ ...也有帮助。

当你在main.c中执行#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列表,只是顺序不同。

对我来说确实如此。

你需要在主要函数之前声明你想要的函数:

#include <stdio.h>
int yourfunc(void);


int main(void) {


yourfunc();
}

不要忘记,如果函数中调用了任何函数,它们的原型必须位于代码中函数的上方。否则,编译器在尝试编译函数之前可能找不到它们。这将产生问题中的错误。

发生此错误是因为您正在尝试使用编译器不理解的函数。如果要使用的函数是用C语言预定义的,只需包含与隐式函数关联的头文件。 如果它不是一个预定义的函数,那么在主函数之前声明它总是一个很好的做法

GNU C编译器告诉您,它可以在程序作用域中找到特定的函数名。尝试在头文件中将其定义为私有原型函数,然后将其导入到主文件中。