在我的 C++ 项目中,当我在头文件中声明全局变量时,我在 Visual Studio 2012 中收到 LNK2005(x 已在 y.obj 中定义)和 LNK1169(找到一个或多个多重定义符号 z.exe)错误,但是当我使用 const 标识符声明全局变量时,我没有收到错误。根据我在 msdn 中的研究,我了解到这是由于项目属性造成的。但是我无法使用属性来修复它们。它只能使用 const 标识符来修复。但是我在 C++ 中找不到任何关于它的规则。它是 C++11 中的新功能吗???
这是全局变量的声明:
extern int my_global;
Run Code Online (Sandbox Code Playgroud)
这是全局变量的定义:
int my_global;
Run Code Online (Sandbox Code Playgroud)
全局变量的声明表示“这是一个对象的名称”。定义说“这是一个对象的名称,请为其分配存储空间” 。
您可以根据需要对全局变量进行任意多的声明(以便任何源文件中的任何人都可以引用同一个对象),但只能有一个定义,因为该对象只能存在于内存中的一个位置,当程序运行。
链接器抱怨您对同一对象有多个定义,因为您将定义放入头文件中,并且该头包含在多个源文件中。因此,当这些源文件被编译时,您将获得多个定义,而链接器无法做到这一点。
解决方案是在头文件中只放置一个声明,然后将定义放置在一个源文件中。例如:
// MyVariables.h
extern int my_global;
// MyVariables.cpp
int my_global = 42;
Run Code Online (Sandbox Code Playgroud)
您看到关键字不同行为的原因const是因为它const提供了全局变量内部链接,这意味着它们对其他源文件不可见。实际上,这意味着包含标头的每个源文件都会获得自己的常量副本。这会占用更多的内存,但不会被注意到。由于它是一个常量,因此没有人会注意到不同的常量引用内存中的不同位置。
C++11 没有改变任何这种行为。这些构造在以前版本的 C++ 中的行为方式都相同。
| 归档时间: |
|
| 查看次数: |
2110 次 |
| 最近记录: |