2013-04-02 52 views
5

我有一個頭文件‘USpecs.h’:多的定義「......」 C

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


#include <iostream> 
#include <vector> 

std::vector<Specs*> UcakSpecs; 


#endif 

我無論是在主要功能,並命名爲Ucak另一個類使用此頭。

但是,當我建立它就會出現以下錯誤:

Ucak.cpp | 6 |`UcakSpecs'的多重定義|

正如我之前搜索過的,它應該可以用#ifndef,但它不是。

+0

請出示CPP代碼文件 –

+0

有一個第一個「包含」錯字。另外,如果這不是'Specs.h'(因爲你包含它),它是什麼?它的工作原理是 – slezica

回答

8

的包括防護裝置僅防止單個翻譯單元內的多個定義(即與它的報頭包括一個源文件)。當您從多個源文件包含標題時,它們不會阻止多個定義。

相反,你應該在頭部聲明:

extern std::vector<Specs*> UcakSpecs; 

,並在一個(也是唯一一個)源文件的定義:

std::vector<Specs*> UcakSpecs; 
+0

。謝謝。 – mucisk

4

夾雜警衛僅防止被包括在相同的翻譯單元不止一次的標題。如果您在多個翻譯單位這個頭,你將有整個計劃UcakSpecs多個定義。

聲明一個全局變量的方法是將其在頭文件中聲明爲extern

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


#include <iostream> 
#include <vector> 

extern std::vector<Specs*> UcakSpecs; 

#endif 

聲明爲extern全局變量只是一個聲明。

然後確定它是隻在一個翻譯單元通過在實現文件(或許在USpecs.cpp)定義它定義;

std::vector<Specs*> UcakSpecs; 
3

#ifndef僅適用於單個編譯單元。既然你有兩個(主要功能和Ucak類),變量被定義了兩次。

考慮在聲明變量作爲extern在頭文件:

extern std::vector<Specs*> UcakSpecs; 

和定義Ucak.cpp文件裏面:

std::vector<Specs*> UcakSpecs; 

這應該工作。