C++中的extern

来源:互联网 发布:淘宝卖家打折设置 编辑:程序博客网 时间:2024/05/16 07:19
从大一正式接触计算机软件技术到现在为止,无论是在理论学习中还是在实践,我都遇到过不少的问题,也通过自己的努力,或者老师同学和百度的帮助,解决了很多问题。然而,在那些问题解决之后,我并没有很细心地把它们一一记下来,总以为自己花精力解决的问题自己是能够记住不忘记的。可事实却总与愿望想违背。今天上软件工程课时,江老师说要养成一下写日志的习惯,这样自己解决过后问题便可以在之后被自己查阅,从而不会再忘记了。那今天我就开始吧。

今天又复习了几章《C++ Primer》,其中关于关键字extern的讨论让我想了很多,并且也在VS8.0编译系统中试验了一些东西。总的来说,extern的含义就是“外部的”,有两个用法。一是当变量还没定义时,用来告诉编译器,这里只声明这个变量,而不去定义它。即告诉编译器,这个变量是“外部的”定义,不是这儿定义的,在这儿只是声明一下。二是当变量已经定义了,用在变量定义的前面,那么它的意思就是告诉编译器,这个变量不仅仅在这一个.cpp文件中有效,它在“外部的”其他.cpp文件中也有效,从而定义了全局变量。下面就四种情况来说明一下有无extern的区别:

1、全局作用域中,变量名后有初始化式(如 int a = 1;):一旦变量名后跟初始化式,那么很明显,这个变量就已经这样被定义了(只声明未定义的变量怎么能拥有一个值呢?)。所以有无extern,在它的第一点用法上就没有区别了。但在它的第二个用法上还是有区别的,若a是extern的,那么a可以在全程序中共享;若a不是extern的,那么a就只能在本身这个.cpp文件中被使用。然而,这里又有一个C++的规定,即全局作用域中的非const变量,默认都是extern的。于是结果就一目了然了。

2、全局作用域中,变量名后无初始化式(如 int a;):这种情况是C++规定的。如果前面没有extern,那么a就是被定义了,并且自动初始化为0;如果前面有extern,那么a就只是声明,而不被定义。

3、局部作用域中,变量名后有初始化式(如 int a = 1;):这种情况下,“int”前面是不允许有extern关键字的。因为这已经是一个定义了。如果加上extern,就表明这个变量可以在程序的其他文件中访问。但是,这是一个局部变量,一旦函数过程结束,它的生命周期就结束了,怎么还可能在别的文件中访问它?所以它就是一个普通的变量定义。

4、局部作用域中,变量后无初始化式(如 int a;):这种情况类似于第2种情况。如果前面没有extern,那么a就是被定义了,并且没有对a进行任何初始化动作;如果前面有extern,那么a就只是被声明,而未进行定义。

C++规定,使用一个变量时,要在代码中那一点的上方对它进行声明,而不必定义。而对于一个变量,在整个程序中它可以被多次声明,但只能被定义一次。所以,理解extern的用法,对于我们掌握C++是很有帮助的。
原创粉丝点击