关于C++变量名引发重定义冲突的思考

文章讲述了C++中全局变量和常量重定义冲突的三种情况,如何通过const声明和extern关键字来解决这些问题,以及链接过程对这些现象的影响。作者记录了学习过程中对这一现象的理解和探索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引发的重定义冲突情况

对于那些简单的重命名冲突再此不再赘述。

情况一

在不同的头文件当中定义同名的全局变量,在运行时会出现重定义的错误。给出一个示例。

//file1.h
int res = 10;	//在file1.h定义一个全局的res变量
//file2.h
int res = 10;	//file2.h定义一个全局的res变量
//main.cpp
int main(){
	return 0;
}

一个项目当中如上的文件组织结构无法通过编译,会出现重定义的错误。如果为变量添加const 声明即可通过编译,其底层原理在《C++ Primer 5th》当中有解释:在默认情况下,const对象被设定为仅在当前文件当中有效.当多个文件中出现多个同名的const变量时,等效于在不同文件当中定义了独立的变量。

//file1.h
const int res = 10;	//在file1.h定义一个全局的res常量
//file2.h
const int res = 10;	//file2.h声明一个全局的res常量

在编译的过程当中,编译器会把file1.h和file2.h文件中所有使用了res的地方都替换成10。

情况二

//file1.h
const int res = 10;	//在file1.h定义一个全局的res常量
//file2.h
const int res = 10;	//file2.h声明一个全局的res常量
//main.cpp
#include "file1.h"
#include "file2.h"
int main(){
	return 0;
}

也就是在情况一解决的基础上,在main函数文件当中包含两个头文件也会导致重定义的错误。

情况三

针对情况一当中的情景,如果常量需要在很多文件使用到,且占存空间很大,那么就会造成大量的冗余,在这种情况下给出一种解决方案:对于const变量不管是声明还是定义都添加extern,这样就只需要定义一次就可以了。

//file1.h
extern const int res;//在file1.h声明一个全局的res常量


//file1.cpp
extern const int res = 10;	//和file1.h当中的res是同一个
//file2.h
//如果file2想要使用file1.h当中 的res
#include "file1.h"
int arr = res;		//可以直接访问,arr=10

在这当中extern关键字的作用是告诉编译器,该变量不是本文件所独有,它的定义将出现在别处。等同于在其他文件当中共享res常量。其他地方要想使用res常量,只需要在文件当中包含#include "file1.h"即可。

至于产生以上问题的原因目前的知识储备只知道是链接过程出现了问题,链接过程当中发生了什么还在继续的探索中,留个传送门~

记录C++学习历程,一起加油。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值