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
があります。
現在のやり方では、POSIX 関数宣言を表示したいという理由だけで、言語方言を妥協し、GCC 拡張と非準拠を受け入れる必要があります。
ただし、ソースコードで醜いことをする必要のない回避策を考え出しました。これを見て:
gcc -Wall -ansi -pedantic -U__STRICT_ANSI__ foo.c -c
それでおしまい。MinGW では、 のような機能選択マクロを使用する代わりに、GCC のマクロを取り除くため-D_POSIX_SOURCE
に使用します。-U__STRICT_ANSI__
./configure
スクリプトにテストを追加-U__STRICT_ANSI__
して、この壊れた状況を検出し、CFLAGS
. 私のプロジェクトでは魅力のように機能します。