获得;函数的隐式声明';fcloseall';在C99中无效;编译为gnu99时

获得;函数的隐式声明';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

考虑以下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_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
未定义的预期链接错误,但没有隐式声明错误。你确定你的错误来自你所展示的代码版本吗?如果你自己声明会发生什么?即put
int 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>