有关C++ 实现时extern 和const的问题

怎样把const常量实现文件间共享?
之所以会先提起这个问题,当然和要解决的问题息息相关。你也许不禁会问:难道const常量不是文件间共享的吗?当然不是,原因是const常量的特殊性。下面我们看看c++ primer的作者怎么说的(重点!):
/——–
当以编译时初始化的方式定义一个const对象时,例如:
const int bufSize = 512;
编译器将在编译过程中把用到该变量的地方都替换成对应的值,也就是说编译器会找到程序中所有用到bufSize的地方,然后用512替换。
为了执行上述替换,编译器必须知道变量的初始值。如果程序包含多个文件,则每个用了const变量的文件都必须得能访问到他的初始值才行。要做到这一点就必须在每一个用到这个量的文件中都对他有定义。为了支持这一用法,同时避免对同一变量的重复定义,默认情况下,const对象被设定为仅在文件内有效(即不是文件间共享的)。从而,当多个文件中出现了同名的const变量时,其实等同于在不同文件中分别定义了独立的变量。
——–/
作者说的很清楚,const变量在不同文件中自己是自己的互不相干!但是程序的写法千变万化,总会有例外的需求,所以:
/——-
某些时候有这样一种const变量,他的初始值不是一个常量表达式,但确实有必要再文件间共享。这种情况下,我们不希望编译器为每个文件分别生成独立的变量。想反,我们想让这些const对象像其他对象(非常量)一样工作(即在文件间共享),也就是说只在一个文件中定义,而在其他多个文件声明并使用它。
——-/
下面给出解决方法:
对const变量不管声明还是定义都添加extern关键字,这样只需要定义一次就可以了。
对解决方法的认识:
其实就是在定义const变量的时候显式的用extern说明了我定义的这个常量是要在文件间共享的,而非默认情况下的当前文件独有。这样的话仅在其他文件中声明一下就可用同一个const变量,这正实现了和其他变量定义声明实现的相同效果!
下面来一个例子:
这里写图片描述

这里写图片描述
上面两幅图片分别展示了两个文件,下面看程序的输出结果:
这里写图片描述
很显然,在我们的意料之中,num的确在两个文件中实现了共享,而且我们仅在Exterm_Const.cpp做了const变量的定义,而在辅助文件help.h中只是做了一次声明。
下面我把辅助文件中的声明注释掉,Oh,看看发生了什么!
这里写图片描述
因为没有了声明,num在辅助文件中变成了陌生人,这很显然,之前程序是在function函数中遇到num时先看到声明,哦,原来在外面可以找到他的定义,于是程序在Exterm_Const.cpp中找到num的定义,并有了一个常量100,之后带着这个100做了其他操作。这也说明我们真的把两个文件中的const变量关联在了一起,只需一次定义,其他文件中声明可用,他真的变得和其他变量平等了!
上面的过程演示了作者的理论以及自己的一些猜想。

extern的部分功能?
extern在针对变量上的功能还是好概括的:实现同一变量在不同文件间的享而又避免重复定义的矛盾。因为同一变量可以被声明多次,但是绝对不可以定义多次!
用法
如果想声明一个变量而非定义它,就在变量名前添加关键字extern(external ,外部的),而且不要显式的初始化变量:
extern int i; //声明i而不是定义i
int j; //声明并定义j
任何包含了显式初始化的声明即变成了定义。我们能给由extern标记的变量赋一个初始值,但是就相当于抵消的extern的作用,也就变成了定义,而不再是声明。
extern double pi = 3.1415; //定义而非声明

其他:在函数体内部,如果试图初始化一个extern关键字标记的变量将引发错误!(错误提示:不允许对外部变量的局部声明使用初始化设定选项)

功能
如果要在多个文件中使用同一个变量,就必须将声明与定义分离,此时变量的定义必须出现在一个文件中,而其他用到该变量的文件必须对其声明,决不能重复定义。
下面是一个变量一次定义到处使用的例子:
这里写图片描述

这里写图片描述

这里写图片描述

关于const与extern联合使用的其他例子
(1)ERROR: B.cpp中的NUM无法解析,未定义。

// A.cpp

const int NUM = 100;
// B.cpp

extern const int NUM;

int i = NUM;
(2)OK

// A.cpp

const int NUM = 100;
// B.cpp

extern const int NUM = 99;

int i = NUM;
(3)OK

// A.cpp

extern const int NUM = 100;
// B.cpp

extern const int NUM;

int i = NUM;
(4)ERROR: NUM重定义

// A.cpp

extern const int NUM = 100;
// B.cpp

extern const int NUM = 99;

int i = NUM;
(5)OK

// A.cpp

extern const int NUM = 100;
// B.cpp

const int NUM = 99;

int i = NUM;
(6)OK

// A.cpp

const int NUM = 100;
// B.cpp

extern const int NUM = 99;

int i = NUM;
(可以自己编写程序尝试体会一下,加深对这块内容的理解!)
好了,对于这变量的声明与定义就先总结到这里,毕竟自己的水平有限,哪里有不当错误之处,希望大家讨论交流!

参考书籍:C++ Prrimer 第五版
参考博文:http://blog.sina.com.cn/s/blog_76fbd24d0101a62k.html

发布了50 篇原创文章 · 获赞 228 · 访问量 17万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章