Visual C++ 2008 の gcc を使用してコードをコンパイルしています。コードは errno_t を使用していますが、gcc ヘッダーの一部のバージョンでは<errno.h>
、型が定義されていません。型が定義されているかどうかを検出するにはどうすればよいですか? 型が定義されたことを知らせる定義はありますか? 定義されていない場合は、すべてのプラットフォームでコードを正しくコンパイルできるように typedef を提供したいと思います。
4 に答える
Microsofterrno_t
は冗長です。errno
は ISO C 標準によって、 type の変更可能な左辺値であると定義されていint
ます。コードで値を保存する必要がある場合errno
は、それらをint
.
グローバル検索と置換s/errno_t/int/
を実行すれば完了です。
編集:また、typedef int errno_t
で終わる名前はすべて_t
予約されているため、コードに a を指定しないでください。
マクロの場合のように typedef をチェックすることはできないため、これは少し注意が必要です。を使用している場合autoconf
、このパッチは autoconf の存在をチェックし、存在しない場合はそれを定義するために必要な最小限の変更を示しますerrno_t
(typedef は、生成されたファイルを含むファイルに配置され、config.h
必要なすべてのファイルに含まれます) 。 errno_t
)。を使用していない場合はautoconf
、ビルド システム内で同じことを行う何らかの方法を考え出す必要があります。または、コンパイラ バージョンのマクロに対する非常に巧妙な一連のテストを行う必要があります。
GCCのどのバージョンが問題を引き起こしているのかがわかっている場合は、それらをテストできます。次のようなものを使用して、GCCのバージョンを確認できます。
#if __GNUC__ == 3
...
#else
...
#endif
これは通常、GNU autoconfが助けになるケースです。基本的に autoconf は、このタイプが存在するかどうか、どのように定義されているかなど、さまざまなシステム依存の機能を検出できる構成スクリプトを生成します。次に、生成された C ヘッダー ファイルをアプリケーション内にインクルードします。