为何extern声明并初始化变量会触发编译警告?
为什么
extern int i = 1;会触发编译警告? 咱们先把C语言里extern关键字的核心作用掰明白:它主要用来声明一个变量/函数是在其他文件(或者当前文件的其他位置)已经定义过的——说白了就是给编译器递个话:“这个东西已经在别处造好了,你别瞎报错,到时候去那边找它就行”,它本身是不负责“造变量”(定义)这件事的。
那你写的extern int i = 1;就犯了个逻辑矛盾:
- 前面的
extern是在说“我只是声明i,它的定义在别处” - 后面的
=1却是在做变量定义+初始化的操作——这时候编译器会自动忽略掉extern的声明属性,把这句当成一个普通的变量定义,但同时又会贴心提醒你:你明明用了extern(声明用的关键字)却又给变量初始化(定义才做的事),这不符合extern的常规使用场景,所以抛出那个警告。
给你两个正确用法的参考:
- 如果只是想声明i(告诉编译器它存在):直接写
extern int i;(不要加初始化) - 如果是想定义并初始化i:直接写
int i = 1;(不需要加extern)
要是你的需求是在当前文件定义i,同时让其他文件能使用它,那标准做法是:
- 在当前文件里写
int i = 1;(完成定义+初始化) - 在其他需要用i的文件里写
extern int i;(声明i,让编译器去别处找它的定义)
这样写就完全符合C语言的规则,不会出现警告啦。
内容的提问来源于stack exchange,提问作者Dxops Rathod
相关产品推荐
相关产品推荐

