C++ extern用法

参考C++ Primer 5th

1.变量的生明和定义中

C++语言支持分离式编译机制,该机制允许将程序分割为若干个文件,每个文件可被独立编译。为了将程序分为许多文件,则需要在文件中共享代码,例如一个文件的代码可能需要另一个文件中中定义的变量。

为了支持分离式编译,C++允许将声明和定义分离开来。变量的声明规定了变量的类型和名字,即使一个名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。定义则负责创建与名字关联的实体,定义还申请存储空间。

如果想声明一个变量而非定义它,就在变量名前添加extern关键字,而且不要显式地初始化变量:

extern int i;  //声明i而非定义
int j;         //声明并定义j

任何包含了显示初始化的声明即成为定义。我们可以给由extern关键字标记的变量赋一个初始值,但这样就抵消了extern的作用,这个语句就不是一个声明,而是一个定义了:

extern int v = 2;
int v = 2;     //这两个语句效果完全一样,都是v的定义

注意: 变量能且只能被定义一次,但是可以被声明多次。

例如,我们可以在extern.cpp中定义int i =1, 然后在main.cpp中声明extern int i(告诉编译器i在其它文件中定义了),接着可以cout i的值,可以发现输出i=1。

2.在多个文件中共享const对象

默认情况下,一个const对象仅在本文件内有效,如果多个文件中出现了同名的const变量时,其实等同于在不同的文件中分别定义了独立的变量。

某些时候有这样一种const变量,它的初始值不是一个常量表达式,但又确实有必要在文件间共享。这种情况下,我们不希望编译器为每个文件分别生成独立的变量。我们想让这类const对象像其他非常量对象一样工作,也就是说,只在一个文件中定义const,而在其他多个文件中声明并使用它。

方法是对于const变量不管是声明还是定义都添加extern关键字,这样只需要定义一次就可以了:

//file1.cpp定义并初始化和一个常量,该常量能被其他文件访问
extern const int bufferSize = function();
//file1.h头文件
extern const int bufferSize; //与file1.cpp中定义的是同一个

file1.h头文件中的声明也由extern做了限定,其作用是指明bufferSize并非本文件独有,它的定义将出现在别处。

例如,我们可以在extern.cpp中定义extern const int i =1, 然后在main.cpp中声明extern const int i(告诉编译器i在其它文件中定义了),接着可以cout i的值,可以发现输出i=1。与上面不一样的是,在定义i的时候也需要加上extern。也就是说,如果想要在多个文件之间共享const对象,必须在定义这个变量时加上extern关键字。

由于以上讨论可知:extern一般是使用在多文件之间需要共享某些代码时。



猜你喜欢

转载自blog.csdn.net/li1914309758/article/details/78662366