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

时间:2011-03-11 19:42:41

标签: 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’

经过一番搜索,我意识到这个例子缺少语句#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;    
}

1 个答案:

答案 0 :(得分:11)

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

通过推理,exit()的类型为:

extern int exit();  // Indeterminate argument list

这与官方声明不同:

extern void exit(int);

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


[狡猾的词'足够'是因为当exit()的声明没有被注释掉时,这段代码会在没有警告的情况下编译,但是当它丢失时会生成警告。

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编码标准的修改。