6

ヘッダー ファイル「USpecs.h」があります。

#ifndef USPECS_H
#define USPECS_H
#include "Specs.h"


#include <iostream>
#include <vector>

std::vector<Specs*> UcakSpecs;


#endif

メイン関数と Ucak という名前の別のクラスの両方でこのヘッダーを使用しています。

しかし、ビルドすると、次のエラーが発生します。

Ucak.cpp|6|`UcakSpecs' の複数の定義|

前に検索したように、#ifndef で問題ないはずですが、そうではありません。

4

3 に答える 3

8

インクルード ガードは、単一の翻訳単位 (つまり、インクルード ヘッダーを含む単一のソース ファイル) 内での複数の定義のみを防止します。複数のソース ファイルからヘッダーをインクルードする場合、複数の定義が妨げられることはありません。

代わりに、ヘッダーに宣言を含める必要があります。

extern std::vector<Specs*> UcakSpecs;

および 1 つの (そして 1 つだけの) ソース ファイル内の定義:

std::vector<Specs*> UcakSpecs;
于 2013-04-02T13:37:38.697 に答える
4

包含ガードは、ヘッダーが同じ翻訳単位に複数回含まれることを防ぐだけです。このヘッダーを複数の翻訳単位に含めるとUcakSpecs、プログラム全体で の複数の定義が作成されます。

グローバル変数を宣言する方法externは、ヘッダー ファイルのように宣言することです。

#ifndef USPECS_H
#define USPECS_H
#inclde "Specs.h"


#include <iostream>
#include <vector>

extern std::vector<Specs*> UcakSpecs;

#endif

as として宣言されたグローバル変数は、extern単なる宣言です。

次に、実装ファイル (おそらく ) で定義することにより、単一の翻訳単位でのみ定義されるようにしますUSpecs.cpp

std::vector<Specs*> UcakSpecs;
于 2013-04-02T13:37:10.753 に答える
3

#ifndef、単一のコンパイル単位にのみ適用されます。2 つ (メイン関数とUcakクラス) があるため、変数は 2 回定義されます。

externヘッダー ファイルのように変数を宣言することを検討してください。

extern std::vector<Specs*> UcakSpecs;

Ucak.cppファイル内で定義します。

std::vector<Specs*> UcakSpecs;

これはうまくいくはずです。

于 2013-04-02T13:37:32.430 に答える