在尝试编译下面的示例时,我收到了一条警告:
>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编码标准的改进.