在了解extern之前首先要知道C++中得单定义规则。所谓的单定义规则(One Definition Rule,ODR)是指变量只能有一次定义。为了满足这种需求,c++提供了两种变量声明。一种是定义声明(defining declaration)简称定义,它给变量分配内存空间;另外一种是引用声明(referencing declaration)简称为声明,它不给变量分配空间,因为它引用已有变量。
在全局变量中,引用声明使用extern关键字且不进行初始化,否则声明为定义,导致分配空间:
1 | int x; // definition x is 0 |
如果要在多个文件中使用外部变量,只需在一个文件中包含该变量的定义(ORD),但在使用改变量的其他所有文件中,都必须使用extern声明这个变量。
例如:
file01.cpp
1 | extern int cats = 20; //definition |
file02.cpp
1 | // use cats and dogs form file01.cpp |
file02.cpp使用的是file01.cpp中定义好的cats 和dogs,在file01.cpp可以不使用extern关键字,但是在file02.cpp中不使用extern关键字则这些 外部声明会变成定义。而且还会违反单定义规则。如下代码所示:
1 | //file01.cpp |
在编译时会出现如下错误:
1 | file02.cpp:5:5: error: redefinition of 'int dogs' |
而在对file02.cpp中添加extern修饰符后则会编译成功并通过,file02.cpp代码如下:
1 |
|
输出为:
1 | 22 |
对于extern声明的函数,表明其在其他源文件中具有定义。