除stdlib.h之外的其他地方是否声明了exit()函数?

art*_*nil 1 c gcc gcc-warning

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

>gcc -o file file.c
file.c: In function ‘main’:
file.c:12: warning: incompatible implicit declaration of built-in function ‘exit’
Run Code Online (Sandbox Code Playgroud)

经过一番搜索,我意识到这个例子缺少陈述#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;    
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 11

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

通过推论,类型exit()是:

extern int exit();  // Indeterminate argument list
Run Code Online (Sandbox Code Playgroud)

这与官方声明不同:

extern void exit(int);
Run Code Online (Sandbox Code Playgroud)

因此警告.习惯它; 修复代码.


[狡猾的词'足够'就在那里,因为当声明exit()未被注释时,此代码会在没有警告的情况下编译,但会在缺失时生成警告.

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

狡猾的话结束.]


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

-Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition
Run Code Online (Sandbox Code Playgroud)

帮助你解决问题,如果(像我一样)你在过时的代码库上工作,而这些代码库还没有经过现代C编码标准的改进.