gpt4 book ai didi

c++ - LNK1169 和 LNK2005 错误

转载 作者:搜寻专家 更新时间:2023-10-31 01:10:11 26 4
gpt4 key购买 nike

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

最佳答案

这是全局变量的声明:

extern int my_global;

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

int my_global;

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

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

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

解决办法是在头文件中只放一个声明,然后在恰好一个源文件中放定义。例如:

// MyVariables.h
extern int my_global;

// MyVariables.cpp
int my_global = 42;

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

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

关于c++ - LNK1169 和 LNK2005 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16199751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com