5

Visual C++ 2008 の gcc を使用してコードをコンパイルしています。コードは errno_t を使用していますが、gcc ヘッダーの一部のバージョンでは<errno.h>、型が定義されていません。型が定義されているかどうかを検出するにはどうすればよいですか? 型が定義されたことを知らせる定義はありますか? 定義されていない場合は、すべてのプラットフォームでコードを正しくコンパイルできるように typedef を提供したいと思います。

4

4 に答える 4

6

Microsofterrno_tは冗長です。errnoは ISO C 標準によって、 type の変更可能な左辺値であると定義されていintます。コードで値を保存する必要がある場合errnoは、それらをint.

グローバル検索と置換s/errno_t/int/を実行すれば完了です。

編集:また、typedef int errno_tで終わる名前はすべて_t予約されているため、コードに a を指定しないでください。

于 2009-09-23T08:47:02.133 に答える
2

マクロの場合のように typedef をチェックすることはできないため、これは少し注意が必要です。を使用している場合autoconfこのパッチは autoconf の存在をチェックし、存在しない場合はそれを定義するために必要な最小限の変更を示しますerrno_t(typedef は、生成されたファイルを含むファイルに配置され、config.h必要なすべてのファイルに含まれます) 。 errno_t)。を使用していない場合はautoconf、ビルド システム内で同じことを行う何らかの方法を考え出す必要があります。または、コンパイラ バージョンのマクロに対する非常に巧妙な一連のテストを行う必要があります。

于 2009-09-23T08:42:43.000 に答える
0

GCCのどのバージョンが問題を引き起こしているのかがわかっている場合は、それらをテストできます。次のようなものを使用して、GCCのバージョンを確認できます。

  #if __GNUC__ == 3
  ...
  #else
  ...
  #endif
于 2009-09-23T08:56:10.770 に答える
0

これは通常、GNU autoconfが助けになるケースです。基本的に autoconf は、このタイプが存在するかどうか、どのように定義されているかなど、さまざまなシステム依存の機能を検出できる構成スクリプトを生成します。次に、生成された C ヘッダー ファイルをアプリケーション内にインクルードします。

于 2009-09-23T08:45:22.603 に答える