1

在尝试编译下面的示例时,我收到了警告:

>gcc -o file file.c
file.c: In function ‘main’:
file.c:12: warning: incompatible implicit declaration of built-in function ‘exit’

经过一番搜索,我意识到该示例缺少语句#include <stdlib.h>。那么exit()函数在哪里声明?图书馆stdio.h没有声明它。我的代码也没有。如果编译器支持它,为什么它会发出警告?另外,为什么在 中重新定义它stdlib.h

例子:

#include <stdio.h>

int main()
{
    char *fn = "./test.txt";
    FILE *fp;

    if((fp = fopen(fn, "w"))==NULL)
    {
        printf("Cannot open file '%s' for writing.\n", fn);
        exit(1);
    }

    fprintf(fp, "Hello, world!\n");

    if(fclose(fp)==0)
        printf("File '%s' closed successfully.\n", fn);
    else
        printf("Error closing file '%s'.\n", fn);

    return 0;    
}
4

1 回答 1

12

即使您不包含标准头文件,GCC 也知道它们的内容,并且当函数的隐含(或推断)声明与包含头文件时的声明不完全相同时会抱怨。

通过推断,类型exit()为:

extern int exit();  // Indeterminate argument list

这和官方声明不一样:

extern void exit(int);

因此发出警告。习惯它; 修复代码。


[weasel word 'sufficiently' 之所以存在,是因为当声明 ofexit()没有被注释掉时,这段代码编译时没有警告,但在缺少时会生成警告。

extern void exit();
int main(int argc, char **argv)
{
    if (argc > 1 && argv[0] != 0)
        exit(1);
    return(0);
}

黄鼠狼的话结束。]


注意:预标准 C 大量使用隐式函数声明。C89 开始鼓励使用正确的定义,部分原因是确保每个标准函数都有一个声明它的头文件。(POSIX 也有助于确保它定义的所有函数都在标头中声明。)C99 更进一步,说函数的预标准和 C89 '隐式 int' 解释不再有效。GCC 现在正在帮助您通过识别函数来修复您的代码。您可以使用以下选项:

-Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition

如果(像我一样)您使用尚未按照现代 C 编码标准进行大修的过时代码库,以帮助您解决问题。

于 2011-03-11T19:47:24.643 回答