C/C++ 开发:全局变量在多文件中的使用 ---一个链接问题的解决

背景:碰到一个链接问题ID_decode.obj : error LNK2005: "char * ReadPath" (?ReadPath@@3PADA) 已经在 Head_decode.obj 中定义
原因:char*
HeadPatch 这个全局变量在.h 中赋值,然后此.h 又被ID_decode.cpp 和Head-decode.cpp 包含,重复定义;
尝试:使用条件编译和#progma once都不好使;
解决在随便一个.cpp 中“定义”全局变量(int B=0;)在一个头文件A.h中添加声明 extern B;  ,然后在所有其他需要使用全局变量B的.cpp 文件中include A.h

原理:首先要明白什么是声明,什么是定义:
声明:我说有A这么个东西,但不知道在哪里赋值
定义:这个东西在这里,并给出了变量的赋值 或者 函数的实现

特性
一个头文件.h 只有声明(类声明,函数声明,extern声明(不可赋值)),可以被多个.cpp 包含。
一个头文件,如果包含了定义,那么就是只能被单个cpp包含

所以,如果你想在头文件中“定义”全局变量(int A = 0),要确保此头文件只被一个.Cpp包含;
如果你想在多个.cpp 中使用同样的全局变量,而又不想在不同的.cpp 中都添加extern,那么,你可以这样做:在随便一个.cpp 中“定义”全局变量(int B=0;)在一个头文件A.h中添加声明 extern B;  ,然后在所有其他需要使用全局变量B的.cpp 文件中include A.h”.

出错情况1:
在.h 中“定义”了全局变量A,然后在不同的.cpp 中使用extern int A;(本例子)
这种编译不会报错,但是链接会显示A已经在不同的.obj中定义;提示错误:ID_decode.obj : error LNK2005: "char * ReadPath" (?ReadPath@@3PADA) 已经在 Head_decode.obj 中定义。

错误情况2:被多个.cpp 包含,如果.h 中的全局变量被赋值,
提示错误:“ReadPath”: 重定义;多次初始化

拓展如果使用extern来声明局部变量会怎样?

运行结果:

实际原因是局部变量太大,导致栈溢出;PC上vS可以调栈到2G:

尽管如此,我们还是不要用extern来声明cpp中的局部变量,按照规矩来,还是要对全局变量使用extern。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值