2

在我的 C++ 项目中,当我在头文件中声明一个全局变量时,我在 Visual Studio 2012 中得到 LNK2005(x 已在 y.obj 中定义)和 LNK1169(一个或多个多重定义的符号找到 z.exe)错误,但是当我用 const 标识符声明全局变量时,我没有收到错误。从我在 msdn 的研究中,我了解到这是因为项目属性。但我无法用属性修复它们。它只能用 const 标识符修复。但是我在 C++ 中找不到任何关于它的规则。它是 C++11 中的新功能吗???

4

1 回答 1

4

这是一个全局变量的声明:

extern int my_global;

Thie 是一个全局变量的定义:

int my_global;

全局变量的声明说“这是一个对象的名称”。定义说“这是一个对象的名称,请为它分配存储空间”

你可以有任意多的全局变量声明(这样任何源文件中的任何人都可以引用同一个对象),但你只能有一个定义,因为当对象只能存在于内存中的一个位置时程序运行。

链接器抱怨您对同一对象有多个定义,因为您将定义放在头文件中,并且该头文件包含在多个源文件中。因此,当这些源文件被编译时,您会得到多个定义,而链接器无法做到这一点。

解决方案是在头文件中只放一个声明,然后将定义放在一个源文件中。例如:

// MyVariables.h
extern int my_global;

// MyVariables.cpp
int my_global = 42;

您使用const关键字看到不同行为的原因是因为const提供了全局变量internal links,这意味着它们对其他源文件不可见。实际上,这意味着每个包含您的标头的源文件都会获得自己的常量副本。这会占用更多内存,但不会很明显。因为它是一个常数,所以没有人会注意到不同的常数指的是内存中的不同位置。

C++11 没有改变任何这种行为。这些结构在以前的 C++ 版本中的行为方式都相同。

于 2013-04-24T18:49:51.857 回答