C++中的extern
2015-08-28 20:37
423 查看
从大一正式接触计算机软件技术到现在为止,无论是在理论学习中还是在实践,我都遇到过不少的问题,也通过自己的努力,或者老师同学和百度的帮助,解决了很多问题。然而,在那些问题解决之后,我并没有很细心地把它们一一记下来,总以为自己花精力解决的问题自己是能够记住不忘记的。可事实却总与愿望想违背。今天上软件工程课时,江老师说要养成一下写日志的习惯,这样自己解决过后问题便可以在之后被自己查阅,从而不会再忘记了。那今天我就开始吧。
今天又复习了几章《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++是很有帮助的。
今天又复习了几章《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++是很有帮助的。
相关文章推荐
- C/C++中操作符的优先级和求值顺序
- C语言标准库函数 qsort 详解
- C++运算符优先级
- 有关C语言程序内存问题的5条规则
- c++最基础的20条规则
- C++宏定义
- c与c++的区别
- C++之 typedef
- 栈的链式实现(C语言描述)
- 【C语言连载六】--------变量、修饰词、结构体、枚举、typedef
- 【C语言连载五】--------指针
- C++静态成员函数小结(转)
- Prototype 模式示例代码 (C++)
- C语言中的内部名和外部名
- LeetCode-Single Number-解题报告
- 转:C++字符串系列
- C++进阶学习指引
- 学习心得:链表的操作(C语言实现)
- 作业《IOS_C语言》进制,C数据类型,常量类型,运算符,表达式,格式化输入输出
- 通俗易懂学C语言-02-C语言程序长啥样以及运行流程