3

_MAX_DRIVE を定義するヘッダー ファイル (bh) を間接的にインクルードする C++ 実装ファイル (my.cpp) があります。

// b.h
#define _MAX_DRIVE  64

次に、my.cpp には、_MAX_DRIVE も定義する stdlib.h が含まれます。

// stdlib.h
#define _MAX_DRIVE  3   /* max. length of drive component */

明らかに、これはマクロ再定義の警告を生成します:

stdlib.h(185) : warning C4005: '_MAX_DRIVE' : macro redefinition

私の質問は次のとおりです。

  1. この再定義によってどの程度のコードが影響を受けますか? my.cpp のコンパイル単位だけですか?
  2. my.cpp が静的ライブラリの一部である場合、再定義された値が他のコードに侵入する可能性はありますか?
  3. my.cpp で _MAX_DRIVE を参照したことがない場合、このマクロの再定義の警告を無視するようにコンパイラに指示しても安全ですか?
4

2 に答える 2

10
  1. 現在のコンパイル単位の終わりまで、または次の まで#undefです。
  2. いいえ; マクロ名は、コンパイルが始まる前に実行を終了するプリプロセッサによってのみ認識されます。
  3. とてもまともな考えとは思えません。同じ名前の 2 つのマクロを使用しないようにすることをお勧めします (特に、実装用に予約されているため、単一のアンダースコアとそれに続く大文字で始まるマクロ)。
于 2012-06-19T22:37:13.293 に答える
3

この再定義によってどの程度のコードが影響を受けますか? my.cpp のコンパイル単位だけですか?

#undef-edでない場合、bh と stdlib.h を含むすべてのファイルに影響します。

my.cpp が静的ライブラリの一部である場合、再定義された値が他のコードに侵入する可能性はありますか?

いいえ、プリプロセッサ シンボルはコンパイル時にのみ存在します。コンパイルされたモジュールはそれとは何の関係もありません。

my.cpp で _MAX_DRIVE を参照したことがない場合、このマクロの再定義の警告を無視するようにコンパイラに指示しても安全ですか?

はい、いつかあなたまたはあなたのコードのユーザーがそれを使用し、この危険性を忘れるか、知らないまで.

于 2012-06-19T22:39:40.470 に答える