在我的C++項目中,當我在頭文件中聲明一個全局變量時,我得到LNK2005(x已經在y.obj中定義)和LNK1169(找到一個或多個乘法定義的符號z.exe)錯誤在Visual Studio 2012中,但是當我用const標識符聲明全局變量時,我沒有得到一個錯誤。從我在msdn中的研究我明白,這是因爲項目屬性。但我無法修復它們的屬性。它是隻用const標識符來固定。但是我在C++中找不到任何關於它的規則。它是C++ 11中的一個新特性嗎?LNK1169和LNK2005錯誤
2
A
回答
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++版本中都表現得相同。
相關問題
- 1. LNK2005和LNK1169錯誤在c + +
- 2. C++錯誤LNK2005和錯誤LNK1169
- 3. C++,良好的舊LNK1169(和LNK2005)錯誤
- 4. 如何忽略LNK2005&LNK1169?
- 5. LNK2005,LNK1169錯誤, 「INT __cdecl克(無效)」 已經定義
- 6. 致命錯誤LNK1169
- 7. 無論我做什麼,我都會得到LNK1169和LNK2005
- 8. 我需要幫助分離C++ LNK2005和LNK1169中的類代碼
- 9. 錯誤LNK2005在C + +和ifndef不工作
- 10. Visual Studio的鏈接錯誤LNK2005 LNK2020和
- 11. VC8到VC10 - LNK2005錯誤
- 12. 錯誤LNK2005,已定義?
- 13. 大量的LNK2005錯誤
- 14. LNK2005錯誤與向量
- 15. 錯誤LNK1169,幫助!我是初學者
- 16. 錯誤LNK 2005和LNK1169 C++的Visual Studio DLL
- 17. 錯誤LNK2005:構造函數已定義
- 18. 鏈接錯誤LNK2005幾個CUDA文件
- 19. 與隊列LNK2005錯誤鏈表
- 20. LNK2005:「已經定義的錯誤
- 21. 與enum相關的C++ LNK2005錯誤
- 22. 錯誤LNK2005:_main已定義在hold.obj
- 23. LNK2005錯誤與多個翻譯單位
- 24. Visual Studio 2015鏈接錯誤LNK2005
- 25. LNK2005,「已定義的錯誤」MSVC2010中的鏈接器錯誤
- 26. 越來越LNK2005和KNK1169錯誤 - 包括在另一個
- 27. 對於extern「C」的兩個文件,C++ lnk2005錯誤,爲什麼?
- 28. LNK2005:在VC刪除已定義的錯誤++
- 29. 如何在Visual Studio(LNK2005)中解決此鏈接錯誤?
- 30. 錯誤LNK2005結構已經定義在.obj文件中
非常感謝,現在我明白了... – user2051331 2013-04-24 21:15:34