为何同一文件中extern关键字失效?附报错代码求解决方案
为什么同一文件里使用extern会报未定义引用错误?
嘿,我来帮你理清这个问题!你遇到的undefined reference错误,核心原因是没搞明白extern关键字的本质——它只是用来声明变量,而不是定义变量。
错误原因拆解
你写的代码里:
extern int x; extern int y; extern int z;
这三行只是告诉编译器:“这三个int类型的变量已经在某个地方(可能是这个文件的其他位置,也可能是其他文件)定义过了,你不用操心内存分配,直接用就行”。但实际上你根本没给这三个变量分配内存(也就是没定义),所以当链接器去寻找这些变量的实际实体时,找不到对应的内存空间,就抛出了那些错误。
哪怕是在同一个文件里,只做extern声明不定义,链接器照样会找不到变量——因为extern本身不创建变量,只是“预告”变量存在。
解决方案
有两种简单的方式可以解决这个问题:
方案1:单独定义变量
在文件里(比如main函数外面,或者声明之后的任意位置)加上变量的定义,给它们分配内存:
#include<iostream> // 声明变量:告诉编译器这些变量存在 extern int x; extern int y; extern int z; // 定义变量:实际分配内存 int x; int y; int z; int main(){ x = 10; y = 15; z = (x>y ? x: y); std::cout<<z; return 0; }
方案2:直接去掉extern(如果只在当前文件使用)
如果这些变量不需要在其他文件共享,其实完全没必要用extern,直接在全局作用域定义变量就行——函数外定义的变量默认是全局变量,编译器会自动分配内存:
#include<iostream> // 直接定义全局变量 int x; int y; int z; int main(){ x = 10; y = 15; z = (x>y ? x: y); std::cout<<z; return 0; }
额外小提示
如果你给extern声明的变量加上初始化值,那它就会变成定义(比如extern int x = 0;)——不过这种写法不推荐,因为会混淆extern的“声明”本质,而且如果把这种代码放到头文件里,还会引发重复定义的问题。
内容的提问来源于stack exchange,提问作者saien
相关产品推荐
相关产品推荐

