質問

私はタイプを定義するレガシー組み込みCコードを使用しています uint8_t, uint16_tuint32_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)などの構成パッケージを使用する必要があります。このような問題を処理するように設計されています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top