在尝试编译下面的示例时,我收到了警告:
>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;
}
答案 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编码标准的修改。