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. 私のプロジェクトでは魅力のように機能します。