解析C++里const,static,extern的文件作用

今天下午偶尔看到primer里面的一句话,默认情况下,const对象仅在本文件内有效,在第5版的54页.我当时就想,这不是和static全局变量的作用域一样吗,所以,我就亲自试了下,
一. 首先在w.cpp里定义一个int N=1
源文件代码如下:
因为 现代编译器 一般采用按文件编译的方式,因此在编译时,各个文件中定义的 是互相不透明的。也就是说,在编译时,全局变量的可见域限制在文件内部。
但是到了链接阶段,要将各个文件的内容“合为一体”,因此,如果某些文件中定义的全局变量名相同的话,在这个时候就会出现错误,也就是会出现重复定义的错误 ,感兴趣的可以试试2个文件全局变量都为N,会产生链接错误的
所以说:最好不用把全局变量名字起的一样,就算编译不报错,可能链接也会报错,所以上面是理所应当找不到N的,编译报错,
二.在源文件加上extern int N;//这句话就是说我声明一下,这个变量是在本包内其他文件,你去找吧,于是就能在w.cpp里面找到,并且能输出
三.在w.cpp里面把变量N加上static为:static int N=1,此时编译不会报错,但是链接会失败,因为static会把N限制在文件内
四.把w.cpp的static int N=1改成const int N=1,结果和三一样,都是链接出问题,说明和static功能一样,会把作用域给限制,primer说的是对的,果然是好书
五.primer也提供了解决方法,可以突破限制,对于const 变量不管是声明还是定义都加上extern关键字就行了,这样就只用定义一次,其他文件都能引用也就是源文件加上extern const int N,w.cpp加上extern const int N=1就行了,结果是成功输出
也就是说:如果想在多个文件之间共享const对象,必须在变量的定义之前添加extern关键字
 
 
本人水平一般,写的错的地方希望指正,能够帮助大家能理解他们的用法最好.
全部评论
建议你看看《程序员的自我修养》,看完链接过程一清二楚,还能自己写个CRT。
点赞 回复 分享
发布于 2016-11-24 21:24

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务