extern的小陷阱

本文探讨了C/C++编程语言中extern关键字的正确用法,特别是关于如何声明与定义全局变量的区别。通过一个具体例子解释了当extern与初始化表达式结合时,实际上构成了变量的定义而非简单声明。

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

对C/C++编程的人来说,关键字extern并不陌生,由extern修饰的变量或函数表明

这是一个会在别处(比如其他文件中)进行定义而在此处声明并在本文件中使用。

在绝大多数情况都没有问题,但是请看下面的例子:

 

 

文件1:firstfile.h

int var = 0;

 

文件2:secondfile.h

extern int var = 0;

 

 

我的本意是想在文件2中使用文件1定义的全局变量var,但实际上并没有达到这样的效果,

跟踪调试发现这个var的变化与我设想的根本不一致。后来查了一下《C++ Primer》发现在8.2

章中有这样一句:  “既指定了关键字 extern 又指定了一个显式初始值的全局对象声明将被

视为该对象的定义 编译器将会为其分配存储区 而且该对象后续的定义都被标记为错误”。

 

至此真相大白,原来extern并不只是有声明的作用,也有定义。对于变量来说,如果在

extern“声明”的时候赋初值,那么就不再是声明,而是定义;对于函数,如果紧跟在后面有一对

空{},那么也同样是定义,编译器会把这些函数及变量当成新定义的来处理(会分配内存,而声明不会)。

secondfile.h中如果这样写:

extern int var; //这样就仅仅是声明需要用到firstfile中的var变量

 

所以,对exern而言,不能只看字面意思,这也算是一个小小的陷阱吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值