1、
学c的时候,接触过extern,没深入研究,直到最近看c++编程思想,看到178页extern const int x=100;
对extern进行测试,首先test2.cpp如下内容
然后test.cpp
不过由于有第2行,所以实际上加入不加入extern都是可以的
然后删掉#include "test2.cpp"和extern语句,在命令行下g++ test2.cpp test.cpp -o test 之后,会出现警告如下
(对文件的连编,直接在工程里添加文件或者用g++连编都可以)
将extern语句加上就好了
2、
至于const int x 的extern
测试如下
text2.cpp
test.cpp
不对x进行cout则能通过,不会报错
在test2.cpp中改为
即可。
而在c语言中,则不需要对const进行extern,测试如下:
test2.c中
test.c中
可以输出结果为100。可以看到在C++中必须在定义处加上extern才能编译并运行,为什么呢?
这涉及C和C++对const的不同处理
在c中,默认const为外部连接,而C++默认const是内部连接,所以如果在C++中想完成C中同样的事情,必须用extern明确把连接改为外部连接(当然,在C语言中也可以这样)
因为C++的const默认内部连接,所以不能一个文件定义const而在另一个文件中又把它作为extern来引用。为了使const成为外部连接,必须定义为extern,此处我们在test2.cpp中改为
就通过进行初始化并指定为extern,我们强迫给这个const分配了内存。(因为const在C++中不必创建内存空间,是否创建依赖于它的使用。一般来说,一个const仅仅用来把名字用一个值替代,如同#define,则存储空间就不必创建,如果取一个const的值得或者把它定义为extern,则会为该const创建内存空间。)
3、
说到const默认为局部变量,想到个static的局部性
stati有个优点,在函数范围之外,不可用,所以不能轻易改变,这样错误就局部化了。C++编程思想70页示范代码:
static另一个作用,在某个作用域外不可访问。
test2.cpp内容如下:
test.cpp如下:
(这里也可以将两个文件的extern和static互换,结果一样)
会得到编译错误,尽管变量fs被声明为extern不过定义为static,同样文件外不可用
即:当static被应用于函数名和所以函数外部的变量时,文件的外部不可以使用这个名字。函数名或变量是局部于文件的,即有文件作用域
好,记完,只供自己参考
另外,参考下
http://blog.csdn.net/hangyu628/archive/2009/01/29/3854487.aspx
参考网址
1、http://blog.csdn.net/keensword/archive/2005/06/23/401114.aspx