1

私が次のことをした場合:

dConst.hpp

const int POWER_LEVEL = 9001;

genPower.hpp

#include "dConst.hpp"

#ifndef GENPOWER_HPP
#define GENPOWER_HPP

const int GENERATOR[1] = { POWER_LEVEL };

#endif

ジェネレーター配列定数を使用するすべてのコードでリンカー エラーが発生します。

#include "dConst.hpp"ただし、コードブロックで切り替えると:

#ifndef GENPOWER_HPP
#define GENPOWER_HPP

できます...

の力を悪用してい#ifndefませんか?

4

2 に答える 2

1

#ifndef の力を十分に活用していません。

ファイルdConst.hppにはガードが必要です。そうしないと、翻訳単位内の複数のファイルから含まれている場合に問題 (まさにあなたが見た問題) が発生します。

genPower.hpp編集: また、include ステートメントの前に、ファイルの先頭にinclude ガードを配置します。

于 2013-11-24T19:42:48.990 に答える
1

はい、間違いなく。

インクルード ガードのポイントは、コードが 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 の間違いです。

于 2013-11-24T19:48:15.483 に答える