在c++程序开发中,当多个源文件需要访问同一个全局变量时,就需要用到外部变量和extern关键字。外部变量指的是定义在其他文件中的全局变量,而extern关键字的作用就是声明该变量是在其他地方定义的,当前文件只是引用它,不会重新分配内存空间。

什么是外部变量
外部变量本质上就是全局变量,只不过它的作用域扩展到其他文件。全局变量在定义的时候会分配内存空间,默认情况下它的作用域只在定义它的文件内,其他文件无法直接访问。如果要在其他文件中使用这个全局变量,就需要通过extern关键字进行声明。
extern关键字的核心作用
extern关键字的核心作用只有两个:
- 声明一个变量是外部定义的,告诉编译器这个变量的定义在其他地方,当前只是引用,不要为它分配内存
- 用于声明全局函数,表明函数是外部定义的,不过函数默认就是extern的,所以通常可以省略
extern声明和变量定义的区别
很多开发者容易混淆extern声明和变量定义,两者的核心区别如下:
| 类型 | 是否分配内存 | 是否可以初始化 | 作用 |
|---|---|---|---|
| 变量定义 | 是 | 可以 | 创建变量,分配存储空间 |
| extern声明 | 否 | 不可以 | 告知编译器变量在其他地方定义,当前文件引用 |
c++使用外部变量的完整流程
使用外部变量需要遵循固定的步骤,否则会出现编译或者链接错误:
第一步:在一个源文件中定义全局变量
首先在某个源文件中定义需要共享的全局变量,比如我们在globals.cpp文件中定义:
// globals.cpp 文件
#include <iostream>
// 定义一个全局变量,分配内存空间
int global_count = 10;
// 定义一个全局函数
void print_global() {
std::cout << "global_count value: " << global_count << std::endl;
}
第二步:在头文件中用extern声明变量和函数
为了方便其他文件引用,我们通常会创建一个头文件,在里面用extern声明变量和函数:
// globals.h 文件 #ifndef GLOBALS_H #define GLOBALS_H // 声明外部变量,不分配内存,不能初始化 extern int global_count; // 声明外部函数,函数默认是extern,写不写都可以 extern void print_global(); #endif
第三步:在其他源文件中包含头文件使用变量
现在其他源文件只需要包含globals.h头文件,就可以使用global_count变量和print_global函数了:
// main.cpp 文件
#include <iostream>
#include "globals.h"
int main() {
// 使用外部变量,修改其值
global_count = 20;
std::cout << "modified global_count: " << global_count << std::endl;
// 调用外部函数
print_global();
return 0;
}
编译运行
编译的时候需要把两个源文件一起编译,命令如下:
g++ main.cpp globals.cpp -o test ./test
运行结果会输出:
modified global_count: 20 global_count value: 20
使用extern的注意事项
- extern声明不能初始化,否则就变成定义了,比如
extern int a = 10;是错误的,除非是const变量的情况 - const全局变量默认是内部链接的,如果要让它成为外部变量,需要在定义的时候加extern,比如
extern const int MAX_NUM = 100; - 不要在头文件中定义全局变量,否则多个源文件包含该头文件的时候会出现重复定义的链接错误
- 如果外部变量是数组,声明的时候可以省略数组长度,比如
extern int arr[];是合法的
总结来说,c++中使用外部变量的核心就是通过extern关键字声明其他文件定义的全局变量,遵循先定义、再声明、后使用的原则,就可以实现跨文件的变量共享。