インクルードガードの必要性
なぜ重複インクルードされると困るのかといいますと、コンパイルエラーになるからです(笑)。理由を以下に説明します
#includeが行う処理は(わかりやすく言えば)テキストファイル(この場合は.cpp)の中に別のテキストファイル(この場合はhoge.h)を単純にコピー&ペーストするだけなのです。これにより、以下のような3つのヘッダファイルを作ったときに問題が発生します。
classA.h
class classA{ ... };
classB.h
#include "classA.h" class classB{ ... };
classC.h
#include "classA.h" #include "classB.h" class classC{ ... };
この時、classC.hは、実際には以下のように展開されてしまいます
class classA{ ... }; class classA{ //classB.hでインクルードされた//classC.hでインクルードされた ... }; class classB{ //classC.hでインクルードされた ... }; class classC{ ... };
みてわかるとおり、classAが2回宣言されてしまいます。これは「すでに定義されているクラスが再定義されました」という旨のコンパイルエラーを吐き出します。