在我的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. LINKER ERROR LNK1169&LNK2005
- 5. 如何忽略LNK2005&LNK1169?
- 6. LNK2005和LNK1169在调试对象
- 7. LNK2005,LNK1169错误, “INT __cdecl克(无效)” 已经定义
- 8. VS2012的Node.js模块:故障排除LNK2005/LNK1169错误
- 9. 致命错误LNK1169
- 10. Linker LNK2005错误
- 11. 无论我做什么,我都会得到LNK1169和LNK2005
- 12. 我需要帮助分离C++ LNK2005和LNK1169中的类代码
- 13. Visual Studio错误LNK2005
- 14. 错误LNK2005在C + +和ifndef不工作
- 15. Visual Studio的链接错误LNK2005 LNK2020和
- 16. 大量的LNK2005错误
- 17. 错误LNK2005,已定义?
- 18. C++链接错误LNK2005
- 19. LNK2005错误,同时为cuPrintf
- 20. VS 2010中的错误LNK2005
- 21. VC8到VC10 - LNK2005错误
- 22. LNK2005错误与向量
- 23. 错误LNK 2005和LNK1169 C++的Visual Studio DLL
- 24. 每个.cpp创建两个LNK2005错误
- 25. CMake链接提升。错误LNK2005
- 26. LNK2005:已经定义的错误
- 27. VC++错误LNK2005已经定义在
- 28. LNK2005:“已经定义的错误
- 29. 在外部DLL上错误LNK2005
- 30. 看似随机的LNK2005与GLFW3错误
非常感谢,现在我明白了... – user2051331 2013-04-24 21:15:34