1

このコード:

#include <stdio.h>
#include <iostream>
using namespace std;
int main() {
  cout << fileno(stdout) << endl;
}

このコンパイラで正常に動作します: http://sourceforge.net/projects/mingwbuilds/files/host-windows/releases/4.7.2/32-bit/threads-posix/sjlj/x32-4.7.2-release-posix- sjlj-rev6.7z

しかし、このパッケージでは: http://nuwen.net/files/mingw/mingw-9.5-without-git.exe

それは返します:test.cpp:5:24: error: 'fileno' was not declared in this scope

4

3 に答える 3

3

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

于 2014-01-10T03:52:38.593 に答える
2

-ansi使用しているコンパイラ フラグを指定していませんが、厳密な ANSI 準拠を強制し、互換性マクロを無効にする でコンパイルしているため、おそらくこれが発生しています。(または のようなもの-std=c99で、これは を意味し-ansiます。)

または を指定せずに、代わりに-ansi標準 like を指定してみてください。-std=gnu99

于 2013-11-05T13:19:35.437 に答える
0

filenoC または C++ の一部ではありませんが、POSIXです。したがって、Windows には場所がありません。移植可能なコードを作成するには、C および C++ 標準によって提供される機能に固執します。

それがおそらく、Windows 用の GCC ポートで出荷しない理由です。対照的に、リンク先の POSIX スレッドの実装は、移植されたコードを元のコードにできるだけ似たものに保つために、実装の詳細としてそれに依存している可能性があります。

それ以上の根拠は主観的であり、トピックから外れています。要するに、あなたは彼らに尋ねなければならないでしょう!

于 2013-01-05T14:52:27.727 に答える