LNK1169和LNK2005错误

时间:2013-04-24 18:41:35

标签: c++ visual-c++

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

1 个答案:

答案 0 :(得分:4)

这是全局变量的声明

extern int my_global;

这是全局变量的定义

int my_global;

全局变量的声明表示“这里是对象的名称”。 定义表示“这是对象的名称,请为其分配存储空间”。

您可以根据需要使用尽可能多的全局变量声明(以便任何源文件中的任何人都可以引用同一个对象),但是您只能有一个定义,因为该对象只能存在于一个位置程序运行时的内存。

链接器抱怨您对同一个对象有多个定义,因为您在头文件中放置了定义,并且该标头包含在多个源文件中。因此,当这些源文件被编译时,您将获得多个定义,并且链接器无法执行此操作。

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

// MyVariables.h
extern int my_global;

// MyVariables.cpp
int my_global = 42;

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

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

相关问题