首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LNK1169和LNK2005错误

LNK1169和LNK2005错误
EN

Stack Overflow用户
提问于 2013-04-25 02:41:35
回答 1查看 1.5K关注 0票数 2

在我的C++项目中,当我在我的头文件中声明一个全局变量时,在visual studio 2012中得到了LNK2005(x已经在y.obj中定义)和LNK1169(找到了一个或多个多个定义的符号z.exe)错误,但是当我用常量标识符声明全局变量时,我没有得到error.From我在msdn中的研究中了解到这是因为项目properties.But我不能用const identifier.But修复它们我在C++.is中找不到关于它的任何规则它是C++11中的一个新功能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-25 02:49:52

这是一个全局变量的声明

代码语言:javascript
复制
extern int my_global;

这是一个全局变量的定义

代码语言:javascript
复制
int my_global;

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

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

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

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

代码语言:javascript
复制
// MyVariables.h
extern int my_global;

// MyVariables.cpp
int my_global = 42;

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

C++11不会更改任何此行为。这些构造在以前的C++版本中都具有相同的行为方式。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16199751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档