C++中extern关键字到底有什么用?除了extern "C"这种用法外,它还可以修饰变量或函数。本文主要讲用extern修饰变量的一些理解,在此之前,强烈建议先看看变量的声明和定义。
变量声明和定义
变量的声明为变量规定了类型和名字,定义除了声明的功能外,还会申请内存空间,可能会为变量赋一个初始值。
变量可以被声明多次,但只能定义一次。
int j; //这是变量的定义!
extern int j; //变量的声明
如果我们想声明一个变量,需要在前面加上extern
一个包含了对变量的显式初始化赋值操作的声明其实是定义
extern int j = 1024; //变量的定义
这也解释了为什么在头文件中我们不能直接int i ; 而需要 extern int i; , 因为如果没有加上extern 标识符就成了定义,当头文件被多次#include 时,就会报变量重定义的错误。
// demo.cpp
int i = 4;
// main.cpp
//一旦我们在main.cpp中声明了变量i,则编译器会自动在当前项目内寻找i的定义
extern int i; //注意这里要加上extern,否则就是变量的定义而非声明了(重定义!)
cout << i; // 输出4
关于const变量在不同文件中的访问
非const变量默认为extern。要使const变量能够在其他文件中访问,必须在文件中显式地指定它为extern。
注意,在上面的示例中,我们并没有在i 的定义中指明它是extern 的,但该变量仍然能被编译器找到。如果该变量被const 修饰,情况则不一样了。
// demo.cpp
const int i = 4; //这里需加上extern修饰
// main.cpp
extern const int i;
cout << i; // !!Error:无法解析的外部符号
这个时候只需要在变量的定义前加上extern 修饰即可。
|