警告:函数的隐式声明


201

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

警告:函数的隐式声明

请帮助我理解为什么会这样。



如果您忘记包含头文件,也会发生这种情况。例如,如果您尝试使用strlen()而不包含string.h,则会出现此错误
kurdtpage 2013年

Answers:


230

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

9
另外,如果您提供了原型检查,则它不只是错别字。另外,如果它是从外部库中检查的,则是否包含了它。
smitec

1
收到此警告后,我无法运行代码。因此,它的行为就像一个错误。
Mien 2014年

@ Flimm,C99C89 / C90对此具有不同的设置
Chen Chen


1
@ZachSaw是的。否则,您将不会重复三次。
尼玛·穆萨维

19

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

主文件

#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
}

7

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

好吧,它对我有用。


3

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

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



1

您需要在主要功能之前声明所需的功能:

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

int main(void) {

   yourfunc();
 }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.