一、extern 的由来
编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相不可见的。也就是说,在编译期间,全局变量的可见域限制在文件内部。如下
1 | // a.cpp |
编译没有问题,但是链接时会出现问题,重复定义。
在链接阶段,各个文件的内容(编译产生的 obj 文件)是被合并到一起的。因而,定义于某文件内的全局变量,在链接完成后,他的可见范围被扩大到整个程序。
extern 的作用就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是他是在别的文件中定义的全局变量,你可以使用”。
extern 不仅可以修饰变量,也可以修饰函数声明
二、extern 修饰函数声明
从本质上讲,变量和函数没有区别。函数名是指向函数二进制开头处的指针。
对模块中函数的引用,最常用的方法是包含这些函数声明的头文件;也可以使用 extern 的方式。想引用那个函数就用 extern 声明那个函数。这大概是 KISS 原则的一种体现。这样做的一个明显的好处是,可以加速程序的编译(确切的说是预处理)的过程,节省时间。
使用 extern "C"
也可以实现 C 和 C++ 的混合编程
c++ 中默认定义了 __cplusplus
,C 语言没有该定义。即用来识别是 C 代码和 C++ 代码。
使用 extern "C"
会让 C++ 编译器按照 C 的编译格式来编译。