MinGW 有fileno
. 从我的 MinGW 窗口:
$ grep -r fileno c:/mingw/include
c:/mingw/include/stdio.h:_CRTIMP int __cdecl __MINGW_NOTHROW _fileno (FILE*);
c:/mingw/include/stdio.h:_CRTIMP int __cdecl __MINGW_NOTHROW fileno (FILE*);
c:/mingw/include/stdio.h:#define _fileno(__F) ((__F)->_file)
c:/mingw/include/stdio.h:#define fileno(__F) ((__F)->_file)
糟糕,不幸的是,问题在于 MinGW 做了一些非常愚蠢的事情。它使扩展的可见性stdio.h
(与 GCC 无关的库)成为 GCC 特定方言控制标志的主题。
Cygwin 也有这个问题,几年前在 Cygwin 邮件列表中的一个讨论线程中,他们强烈否认这是一个问题。
正确的方法是使用特征选择宏,例如_POSIX_SOURCE
,_XOPEN_SOURCE
等等。(这些宏近年来激增,变得更加复杂。)
MinGW 应该服-D_POSIX_SOURCE
从命令行显示fileno
,即使--ansi
是指定的。
现在的情况是,您必须妥协语言方言并接受 GCC 扩展和不合规性,只是因为您希望 POSIX 函数声明可见。
然而,我想出了一个解决方法,它不涉及在源代码中做任何丑陋的事情。看这个:
gcc -Wall -ansi -pedantic -U__STRICT_ANSI__ foo.c -c
就是这样。-D_POSIX_SOURCE
在 MinGW 上,我们使用-U__STRICT_ANSI__
剥离 GCC 的宏,而不是使用类似的特征选择宏。
我在./configure
脚本中添加了一个测试来检测这种损坏情况并添加-U__STRICT_ANSI__
到CFLAGS
. 在我的项目中就像一个魅力。