stdint.hの存在の存在をコンパイルします
質問
私はタイプを定義するレガシー組み込みCコードを使用しています uint8_t, uint16_t
と uint32_t
を使用してヘッダーファイルで typedef
キーワード。
議論のために、ファイルを言ってみましょう typedefs.h
これらの定義が含まれています。
私の新しいCソースモジュールには、含めます stdint.h
. 。また、含まれる他のヘッダーファイルも含めます typedefs.h
階層のどこか。予想どおり、コンパイラは複数の定義されたシンボルについて不満を言います。
レガシーファイルを変更したいと思います typedefs.h
それが宣言するだけです uint*_t
どちらかの場合 stdint.h
場合は含まれていないか、それ以上は含まれていません uint*_t
タイプは定義されていません。
私の理解はそれです #ifndef
それ以来使用することはできません typedef
プリプロセッサ指令ではありません。
では、コンパイラに定義しないように伝えるにはどうすればよいですか uint*_t
それらがすでに存在する場合(または stdint.h
すでに含まれています)?
注:これは、C仕様が定義された標準にヘッダーファイルのガード定義が含まれている場合、簡単です。
FWIW、私はARM9プロセッサにグリーンヒルズコンパイラ4.24を使用しています。
解決
レガシーヘッダーを常に修正して、常に含めてください stdint.h
これらのタイプを取得するには、重複する定義を削除し、ドロップインファイルを提供します stdint.h
それがない壊れたシステムのために。
他のヒント
私はそれを信じています stdint.h
また、定義するタイプの制限についてマクロを定義する必要があります。使用している人をテストできるはずです #ifdef
そして、同様。
#ifndef UINT32_MAX
typdef ... uint32_t;
#define UINT32_MAX ...
...
#endif
編集:元々はUINT32_MINを使用していましたが、Jens Gustedtが発生したように、これは署名/符号なしとMIN/MAXの1つの組み合わせです。
UNIXシステムを使用している場合は、ステップをバックアップして、AutoCONF(1)やAutomake(1)などの構成パッケージを使用する必要があります。このような問題を処理するように設計されています。