在C++(以及C)中,extern关键字用于声明一个变量或函数是在别的文件中定义的,或者是在当前文件的后面定义的。它告诉编译器该变量或函数是在其他地方定义的,因此编译器在编译当前文件时不会为其分配内存空间,而是会在链接阶段查找并链接到实际定义的变量或函数。
- 使用场景
跨文件共享变量:当你需要在多个源文件中共享一个全局变量时,可以在一个文件中定义该变量(通常放在.cpp文件中),然后在其他需要访问这个变量的文件中使用extern关键字声明它(通常放在.h头文件中)。
// file1.cpp
int globalVar = 10;
// file2.h
extern int globalVar;
// file2.cpp
#include "file2.h"
void someFunction() {
globalVar = 20;
}
- 跨文件共享函数:虽然对于函数来说,extern是隐式的(即,默认情况下,函数就是跨文件可见的),但在某些情况下,为了明确表明函数的外部链接性,或者为了与变量声明保持一致,也可以显式地使用extern来声明函数。
// file1.h
extern void myFunction();
// file1.cpp
#include "file1.h"
void myFunction() {
// 函数实现
}
// file2.cpp
#include "file1.h"
void anotherFunction() {
myFunction(); // 调用file1.cpp中定义的函数
}
注意事项
使用extern时,需要确保变量或函数在链接时只有一个定义(One Definition Rule, ODR),但可以有多个声明。
对于模板、内联函数和静态局部变量,extern的使用方式有所不同或通常不适用。
在C++中,静态成员变量也需要在类定义外部定义一次,但不需要使用extern,而是使用类名和::作用域解析运算符来定义。
在C++17及以后的版本中,引入了inline变量,它允许在多个源文件中定义相同的变量,而不需要担心ODR问题。这与extern变量在用途上有所不同。