C exit()函数是否在stdlib.h以外的任何地方声明?
在尝试编译下面的示例时,我收到了一条警告:C exit()函数是否在stdlib.h以外的任何地方声明?,c,gcc,gcc-warning,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语句。 然后退出函数在哪里声明?库stdio.h没有声明它。我的代码也一样。如果编译器支持它,为什么它会给出警告?另外,为什么它在stdlib.
>gcc -o file file.c
file.c: In function ‘main’:
file.c:12: warning: incompatible implicit declaration of built-in function ‘exit’
经过一番搜索,我意识到示例缺少include语句。
然后退出函数在哪里声明?库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;
}
GCC知道标准头的内容,即使您没有包含它们,并且当函数的隐含或推断声明与包含头时的声明不完全相同时,GCC也会抱怨 根据推断,出口类型为: 这与官方声明不同:
extern void exit(int);
因此发出警告。习惯它;修复代码
[存在黄鼠狼词“充分”,因为当退出声明未注释掉时,此代码编译时不会发出警告,但当退出声明丢失时会生成警告
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编码标准进行彻底修改。GCC知道标准头的内容,即使您不包括它们,并在函数的隐含或推断声明与包含标头时的声明不完全相同时进行投诉 根据推断,出口类型为: 这与官方声明不同:
extern void exit(int);
因此发出警告。习惯它;修复代码
[存在黄鼠狼词“充分”,因为当退出声明未注释掉时,此代码编译时不会发出警告,但当退出声明丢失时会生成警告
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编码标准进行彻底修改。我相信,当您引用一个不存在的函数时,行为是未定义的。我相信当您引用一个不存在的函数时,行为是未定义的。谢谢您这样的建议广泛的回复。谢谢你如此广泛的回复。