#defineによって定義されたシンボルは,コンパイルするソースファイルひとつの単位でのみ有効です。
コンパイラの引数に複数のソースファイルを書いても,基本的にコンパイラは個々にコンパイルを行います。
このため,#defineの定義は同時にコンパイラに渡された他のソースファイルの影響を受けません。
インクルードガードは,1つのソースファイルから,同一のファイルが(直接・間接問わず)複数回インクルードされた場合にエラーにならないようにする物です。
極端な例だと
コード:
#include "setdata.h"
#include "setdata.h"
ですが,こういうことはまず起こりません。
実際にあるのは
- a.cppはb.hとc.hをインクルード
- c.hはb.hをインクルード
というような場合でしょうか。
この場合,a.cppという1つのソースファイルからb.hが2回インクルードされることになります。
このような場合にエラーにならないように,インクルードガードを行います。