2013-04-24 56 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