2013-04-24 93 views
2

在我的C++項目中,當我在頭文件中聲明一個全局變量時,我得到LNK2005(x已經在y.obj中定義)和LNK1169(找到一個或多個乘法定義的符號z.exe)錯誤在Visual Studio 2012中,但是當我用const標識符聲明全局變量時,我沒有得到一個錯誤。從我在msdn中的研究我明白,這是因爲項目屬性。但我無法修復它們的屬性。它是隻用const標識符來固定。但是我在C++中找不到任何關於它的規則。它是C++ 11中的一個新特性嗎?LNK1169和LNK2005錯誤

回答

3

這是一個全局變量的聲明

extern int my_global; 

Thie是一個全局變量的定義

int my_global; 

一個聲明的全局變量說「這裏是一個對象的名字「。 A 定義說「這裏是一個對象的名稱,請爲它分配存儲空間」。

您可以根據需要擁有儘可能多的全局變量聲明(以便任何源文件中的任何人都可以引用同一個對象),但只能有一個定義,因爲對象只能存在於一個地方在程序運行時在內存中。

鏈接器抱怨你有同一對象的多個定義,因爲你在頭文件中放置了一個定義,並且該頭文件包含在多個源文件中。所以,當這些源文件被編譯時,你會得到多個定義,並且鏈接器不能這樣做。

解決的辦法是把只聲明在頭文件,然後把定義在恰好一個源文件。例如:

// MyVariables.h 
extern int my_global; 

// MyVariables.cpp 
int my_global = 42; 

原因你看到不同的行爲與const關鍵字是因爲const給全局變量內部聯動,這意味着他們沒有其他源文件可見。實際上,這意味着包含頭文件的每個源文件都會獲得自己的常量副本。這會佔用更多的內存,但不會引人注意。既然它是一個常量,沒有人會注意到不同的常量指向內存中的不同位置。

C++ 11沒有改變任何這種行爲。這些構造在以前的C++版本中都表現得相同。

+0

非常感謝,現在我明白了... – user2051331 2013-04-24 21:15:34