3

初めてインクルード(インクルードガードを含む)のfile1.cときに実行されます。しかし今、別の人が同じものを含むとき、マクロはすでに定義されていますか、それはすべて同じ話であり、以前の定義はここに伝播されませんか?inc.h#ifndef INC_H#define INC_Hfile2.cinc.hINC_H

4

5 に答える 5

4

マクロ定義は、別々のコンパイル間で保持されません。

于 2011-11-25T11:53:28.573 に答える
2

コンパイルfile2.cすると、コンパイラが新たに起動します。コンパイル時に定義されたプリプロセッサシンボルはfile1.c、のコンパイル中には何の役割も果たしませんfile2.c

于 2011-11-25T11:54:41.047 に答える
2

しかし今、別のfile2.cに同じinc.hが含まれている場合、マクロINC_Hはすでに定義されています。

はい、いいえ。状況によって異なります。

  • file2.cを含むヘッダーが含まれている場合inc.hはいINC_Hはすでに定義されていfile2.cます。これは、あらゆるレベルの包含に当てはまります。

  • それ以外場合は、まだ定義されていません。

ガードは、ヘッダーが間接的または直接的に複数回ファイルに含まれるのを防ぎます。

于 2011-11-25T11:52:45.387 に答える
0

定義は*.cファイル間で伝播されません。もしそうなら、*.hそもそもファイルは必要ありません。(ただし、ファイルを作成することはでき#includeます*.cが、それは別の話です。)

于 2011-11-25T11:53:27.190 に答える
0

いいえ、「#include」が何をするかを少し考えてみてください。基本的に、ヘッダーファイルの内容をインクルードされている場所にコピーします。

したがって、ファイルに最初に含まれるINC_Hときに定義されます。ただし、これによって別の.cファイルが変更されることはありません。inc.h.c

インクルードガードは、インクルードファイルに他のインクルードが含まれている場合に役立ちます。このような場合、ガードの使用上の問題を回避できます。

于 2011-11-25T11:53:36.800 に答える