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

问题描述 投票:0回答:10

我的编译器(GCC)向我发出警告:

警告:函数的隐式声明

为什么会来?

c compiler-warnings
10个回答
330
投票

您正在使用编译器尚未看到其声明(“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);

33
投票

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

示例

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
}

12
投票

在 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 列表,只是顺序不同。

嗯,对我来说确实如此。


4
投票

您需要在 main 函数之前声明所需的函数:

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

int main(void) {

   yourfunc();
 }

3
投票

当您获得

error: implicit declaration of function
时,它还应该列出有问题的函数。通常,由于忘记或丢失头文件而发生此错误,因此在 shell 提示符下,您可以键入
man 2 functionname
并查看顶部的
SYNOPSIS
部分,因为此部分将列出需要包含的所有头文件。或者尝试 http://linux.die.net/man/ 这是在线手册页,它们带有超链接并且易于搜索。 函数通常在头文件中定义,包括任何所需的头文件通常就是答案。正如 cnicutar 所说,

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


3
投票

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


2
投票

如果您定义了正确的标头并且使用非

GlibC
库(例如 Musl C),当遇到
gcc
等 GNU 扩展时,
error: implicit declaration of function
也会抛出
malloc_trim

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

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

1
投票

出现此错误是因为您尝试使用编译器无法理解的函数。如果您尝试使用的函数是用 C 语言预定义的,则只需包含与隐式函数关联的头文件即可。 如果它不是预定义函数,那么在主函数之前声明该函数始终是一个好习惯。


0
投票

我认为这个问题没有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__ ...
也可以提供帮助。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.