基本定义:
C++编程中,extern是一个非常重要的关键字,它的用途主要是用来声明一个全局变量或者函数。它告诉编译器,其声明的变量或者函数是在别的文件中,提示编译器在链接阶段从其他文件中寻找此变量或函数的定义。也就是说,它只是告诉编译器变量或函数的类型,而不会分配内存。
extern int x; // 声明变量'x'是在其他文件中定义的
一般用法:
链接外部变量:当我们在多个文件中使用同一个变量时,extern可以帮助我们实现这一目标。例如,我们有两个文件,A.cpp和B.cpp,我们可以在A.cpp中定义一个变量,在B.cpp中通过extern关键字来使用这个变量。
//A.cpp
int testext = 0; // 定义一个全局变量
//B.cpp
extern int testext; //声明外部变量
int main() {
//使用外部变量
testext = 10;
return 0;
}
链接外部函数:除了变量之外,extern也可以用于声明在其他文件中定义的函数。我们可以在A.cpp中定义一个函数,在B.cpp中通过extern关键字来使用这个函数。
//A.cpp
void testFunc() //定义一个函数
{
// 函数体
}
//B.cpp
extern void testFunc(); //声明外部函数
int main() {
//调用外部函数
testFunc();
return 0;
}
对于函数而言,由于函数的声明如“extern int func ();”与函数定义“int func (){}”可以很清晰的区分开来,为了简便起见,可以把extern关键字省略,而变量的声明一定不可以省略。但是在引用函数的文件中,必须使用extern关键字
//以下2种写法是等效的
void testFunc();
extern void testFunc();
也可以将声明语句放在一个头文件中,然后被其他文件#include。extern的作用就是扩大变量的作用域,首先将变量作用域扩展到头文件,头文件再被其他文件include,作用域又扩展到调用文件。
//a.h
using namespace std;
extern int num_a;
//b.cpp
#include "a.h" //包含头文件
void print()
{
cout<<num_a<<endl;
}
extern "C"的用法:
在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern "C"就是其中的一个策略。它告诉编译器,在编译 func 函数名时,按照 C 的规则去翻译相应的函数名,而不是 按C++ 的方式,这样当C++代码被C语言调用时,可以避免链接错误
extern "C" void testFunc(); // 用C语言方式链接的函数
总结:
在C++编程中,理解并熟练掌握extern关键字的用法,对于我们编写模块化、可重用的代码,实现跨文件的变量和函数的共享,具有重要的意义。