c++在头文件中定义变量引起的重复定义

c++在头文件中定义变量引起的重复定义

以前有很多博客讲过,大家可以把全局变量定义在某个头文件中,使用的时候直接include就好。但是我此前并未实践过,如今第一次实践就发现不对劲。

错误展示
错误情况1

a.cpp

#include "a.h"
num = 100;

a.h

int num;
//下面是a.h的类定义,所以就不贴了

错误显示

this declaration has no storage class or type specifier

错误原因:对变量的赋值一般不能放在函数外,只有在定义全局变量时的初始化才能被允许。如果要在函数外定义变量,要么就不要赋值定义,要么就在声明之后立刻定义。

这就意味着我们平时在对变量进行赋值时要么直接在初始化的时候一步到位,要么在函数里再进行修改。

错误情况2

a.h

#include "a.h"
int num = 100;

b.cpp

#include "b.h"
#include "a.h"
#include "stdio.h"
extern int num;
void b::print(){
    printf("%d\n",num);
}

c.cpp

#include "a.h"
#include "b.h"
#include "c.h"
#include "stdio.h"
extern int num;
void c::print(){
    b bi;
    bi.print();
    printf("%d\n",num);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sa5FTsSh-1692081982895)(C:\Users\oc\AppData\Roaming\Typora\typora-user-images\image-20230815135201714.png)]

意思是重复定义,在链接的时候出错了,这种在.h文件中定义,让其他文件include并使用extern声明似乎是我们的理想方法,但这并不符合编译器的操作。

img

大家可以参见这张图,首先是各自的h文件和cpp文件生成.o文件,然后所有的.o文件就会进行链接。如果我们把全局变量定义在a.h文件中,之后的b.h和c.h会都include 这个变量,同时各自生成b.o和c.o。当进行链接时就会发现双方都有关于全局变量的定义,所以导致报错重复定义。正确的做法是将变量在.cpp变量进行声明定义,然后在其他地方使用时用extern进行声明即可。

会发现双方都有关于全局变量的定义,所以导致报错重复定义。正确的做法是将变量在.cpp变量进行声明定义,然后在其他地方使用时用extern进行声明即可。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值