初めてインクルード(インクルードガードを含む)のfile1.c
ときに実行されます。しかし今、別の人が同じものを含むとき、マクロはすでに定義されていますか、それはすべて同じ話であり、以前の定義はここに伝播されませんか?inc.h
#ifndef INC_H
#define INC_H
file2.c
inc.h
INC_H
5 に答える
マクロ定義は、別々のコンパイル間で保持されません。
コンパイルfile2.c
すると、コンパイラが新たに起動します。コンパイル時に定義されたプリプロセッサシンボルはfile1.c
、のコンパイル中には何の役割も果たしませんfile2.c
。
しかし今、別のfile2.cに同じinc.hが含まれている場合、マクロINC_Hはすでに定義されています。
はい、いいえ。状況によって異なります。
file2.c
を含むヘッダーが含まれている場合inc.h
、はい、INC_H
はすでに定義されていfile2.c
ます。これは、あらゆるレベルの包含に当てはまります。それ以外の場合は、まだ定義されていません。
ガードは、ヘッダーが間接的または直接的に複数回ファイルに含まれるのを防ぎます。
定義は*.c
ファイル間で伝播されません。もしそうなら、*.h
そもそもファイルは必要ありません。(ただし、ファイルを作成することはでき#include
ます*.c
が、それは別の話です。)
いいえ、「#include
」が何をするかを少し考えてみてください。基本的に、ヘッダーファイルの内容をインクルードされている場所にコピーします。
したがって、ファイルに最初に含まれるINC_H
ときに定義されます。ただし、これによって別の.cファイルが変更されることはありません。inc.h
.c
インクルードガードは、インクルードファイルに他のインクルードが含まれている場合に役立ちます。このような場合、ガードの使用上の問題を回避できます。