はい、間違いなく。
インクルード ガードのポイントは、コードが 2 回インクルードされないようにすることです。ヘッダー ファイルにインクルード ガードの内側にないコードがある場合、そのヘッダーを 2 回インクルードすると、ガードの外側にあるすべてのコードを 2 回定義していることになります。 .
何が起こっているのかを少し理解するために、生成されたコードは次のようになります。
#include は基本的に、インクルードされたファイルの内容を他のファイルに直接挿入するだけです。つまり、genPower.hpp は次のようになります (インクルード ガードが適切に配置されていない場合は、最初の質問のように):
const int POWER_LEVEL = 9001;
#ifndef GENPOWER_HPP
#define GENPOWER_HPP
const int GENERATOR[1] = { POWER_LEVEL };
#endif
したがって、そのファイルを含めるたびに、#ifndef に到達する前に、POWER_LEVEL が定義されます。#ifndef/#define を使用して POWER_LEVEL 行を切り替えると、このファイルをインクルードするたびに、既にインクルードされているかどうかが最初にチェックされます (#ifndef を使用 - 既にインクルードされている場合、#define はその作業を完了しているはずです)。 ) そして、その時だけ (これが初めてであることがわかったら) POWER_LEVEL を定義します。
また、ほとんどの場合、dConst.hpp にもインクルード ガードが必要です。すべてのヘッダーにインクルード ガードが必要であり、ヘッダー ファイル内のすべてをガードする必要があります。それは #ifndef の間違いです。