【C++】关键字 `extern`

340 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

C/C++中extern关键字详解

一个很容易忽略的关键字

基本解释

extern可以放在变量或者函数前。表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找定义。此外exrtern也可以用来进行链接指定。

1. 用作外部变量的声明与使用

如果在多个文件中使用外部变量,只需在一个文件中包含该变量的定义(单定义规则),但在使用该变量的其他所有文件中,都必须使用extern声明它:

//file01.cpp
extern int cat = 20; //定一个flag变量并初始化
int dog = 22;
int fleas;
//file02.cpp
//使用file01的cat和dog
extern int cat;
extern int dog;

在上述例子中,因为file02并没有声明fleas变量,因此无法使用,但是声明了catdog,因此可以使用这两个变量。由此可见,关键字extern并非必不可少的,因为即使省略它,效果也相同。

2、函数的声明

函数的声明中extern关键字是可有可无的,因为函数本身不加修饰的话就是extern。但是引用的时候一样需要声明。

3、可以多次声明,但是定义只能一次

extern int i; //声明,不是定义
int i; //声明,也是定义

补充

如果在.cpp里调用了c库中定义的函数,那么需要将c库中的函数使用 extern “C” 来防止这些函数被C++中的命名重整(name manling)修改名字,造成无法找到对应的c函数。
比如:
c库中定义实现了如下函数:

int func1(int x);
int func2(char *str);

如果要在.cpp中使用这些函数,必须通过下面的形式导入:

extern "C" int func1(int x);
extern "C" int func2(char *str);
extern "C"
{
     int func1(int x);
     int func2(char *str);     
}

这样,C++就不会对extern "C"包含的函数func1,func2进行命名重整了。才能够根据函数名找到对应的函数。