LNK1169和LNK2005错误 在我的C++项目中,当我在头文件中声明一个全局变量时,我得到了LNK2005(X已经在y.Objo中定义)和LNK1169(一个或多个定义了符号的Z.EXE)错误,在VisualStudio 2012中,但是当我用const标识符声明全局变量时,我没有发现错误。从我在MSDN的研究中,我知道这是因为项目属性。但是我不能用属性来修复它们。它只用const标识符固定。但是我在C++中找不到任何规则。这是C++ 11中的一个新特性吗??< /p> < p>这是一个全局变量声明< /强>: extern int my_global; int my_global;

LNK1169和LNK2005错误 在我的C++项目中,当我在头文件中声明一个全局变量时,我得到了LNK2005(X已经在y.Objo中定义)和LNK1169(一个或多个定义了符号的Z.EXE)错误,在VisualStudio 2012中,但是当我用const标识符声明全局变量时,我没有发现错误。从我在MSDN的研究中,我知道这是因为项目属性。但是我不能用属性来修复它们。它只用const标识符固定。但是我在C++中找不到任何规则。这是C++ 11中的一个新特性吗??< /p> < p>这是一个全局变量声明< /强>: extern int my_global; int my_global;,c++,visual-c++,C++,Visual C++,这是全局变量的定义: extern int my_global; int my_global; 一个全局变量的声明说“这里是一个对象的名称”。定义是“这是一个对象的名称,请为它分配存储空间” 一个全局变量可以有任意多个声明(以便任何源文件中的任何人都可以引用同一个对象),但只能有一个定义,因为当程序运行时,该对象只能存在于内存中的一个位置 链接器抱怨您对同一对象有多个定义,因为您正在将一个定义放入头文件中,并且该头包含在多个源文件中。因此,当编译这些源文件时,您会得到多个定义,而链接器不能这

这是全局变量的定义:

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

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

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

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

// MyVariables.h
extern int my_global;

// MyVariables.cpp
int my_global = 42;
使用
const
关键字看到不同行为的原因是
const
提供了全局变量内部链接,这意味着其他源文件看不到它们。实际上,这意味着包含头文件的每个源文件都有自己的常量副本。这会占用更多的内存,但不会引起注意。由于它是一个常数,没有人会注意到不同的常数表示内存中的不同位置


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

< P>这是一个全局变量<强>声明< /强>:

extern int my_global;
int my_global;
这是全局变量的定义:

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

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

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

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

// MyVariables.h
extern int my_global;

// MyVariables.cpp
int my_global = 42;
使用
const
关键字看到不同行为的原因是
const
提供了全局变量内部链接,这意味着其他源文件看不到它们。实际上,这意味着包含头文件的每个源文件都有自己的常量副本。这会占用更多的内存,但不会引起注意。由于它是一个常数,没有人会注意到不同的常数表示内存中的不同位置

C++11没有改变任何这种行为。在C++的前版本中,这些构造都表现了相同的方式。