获得;函数的隐式声明';fcloseall';在C99中无效;编译为gnu99时
考虑以下C代码:获得;函数的隐式声明';fcloseall';在C99中无效;编译为gnu99时,c,c99,clang,C,C99,Clang,考虑以下C代码: #include <stdio.h> #include <stdlib.h> void fatal(const char* message){ /* Prints a message and terminates the program. Closes all open i/o streams before exiting. */ printf("%s\n", message); fcloseall(); exit(EXIT_FAIL
#include <stdio.h>
#include <stdlib.h>
void fatal(const char* message){
/*
Prints a message and terminates the program.
Closes all open i/o streams before exiting.
*/
printf("%s\n", message);
fcloseall();
exit(EXIT_FAILURE);
}
#包括
#包括
无效致命(常量字符*消息){
/*
打印消息并终止程序。
退出前关闭所有打开的i/o流。
*/
printf(“%s\n”,消息);
fcloseall();
退出(退出失败);
}
我正在使用clang2.8编译:clang-Wall-std=gnu99-o
和get:函数“fcloseall”的隐式声明在C99中无效
这是正确的,但我显式编译到gnu99[它应该支持fcloseall()],而不是c99。
虽然代码可以运行,但我不希望在编译时出现未解决的警告。
我怎样才能解决这个问题
编辑:更正了tipo。以在包含标准标题时包含非标准扩展名,您需要定义相应的功能测试宏。在这种情况下,
\u GNU\u SOURCE
应该可以工作
#define _GNU_SOURCE
#include <stdio.h>
定义GNU源
#包括
这与启用语言扩展而非库扩展的
-std=gnu99
无关。在fcloseall()的man
页面中
定义GNU源
#包括
您必须定义宏_GNU_SOURCE is You snippet,以及stdio.h
头<代码>\u GNU_SOURCE
是一个用于创建可移植应用程序的功能测试宏。我剪切并粘贴了您的代码,得到了一个关于main
未定义的预期链接错误,但没有隐式声明错误。你确定你的错误来自你所展示的代码版本吗?如果你自己声明会发生什么?即putint fcloseall(无效)代码>某个地方。绝对没有理由调用fcloseall
。这是一个无用的非标准函数exit
已经安全地关闭了所有文件,如果您的程序将以\u exit
或exec
结束,则fflush(NULL)
将刷新所有同样好且符合标准的文件。@R:好的,这是有用的信息-谢谢。我将相应地修改我的代码。-1不要在代码中定义\u GNU\u SOURCE
,而是使用-D\u GNU\u SOURCE
@让我想想:你能解释一下或者提供一个支持性的参考吗?谢谢。@让我强烈反对。如果代码依赖于特定标准的功能,则应在源代码中明确说明这种依赖。@Charles在代码中定义\u GNU\u source
仅适用于定义后的包含。这很容易导致代码中包含同一标头的多个不同版本。使用编译器标志将防止出现此问题。应该进一步注意的是,fcloseall
没有合法的用途,就像一个假设的freeall
函数没有合法的用途一样。取消分配给定类型的“所有”资源是一个编程错误;它们应该由拥有它们的代码单独释放,或者根本不释放fflush(0)
将是一种非常安全和可移植的方式,可以确保在不违反此原则的情况下写入所有数据,但随后调用exit
已经做了正确的事情,因此整个问题都是Cargo Cult编程的问题。。。
#define _GNU_SOURCE
#include <stdio.h>