C++理论梳理5——变量的作用域和生命周期
- 作用域就是一个变量可以被引用的范围,如:全局作用域、文件作用域、局部作用域
- 生命周期就是这个变量可以被引用的时间段
- 变量的作用域和生命周期本质是内存管理问题,一个程序的内存分为代码区、全局数据区、堆区、栈区等
- 若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
- 若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
全局变量
- 作用域:全局作用域(全局变量只需在一个源文件中定义,其他源文件声明即可使用,详见声明与定义)
- 生命周期:程序运行期一直存在
- 引用方法:其他文件对要使用的全局变量进行extern关键字声明。
- 内存分布:全局数据区
- 注意:如果在两个文件中都定义了相同名字的全局变量,连接出错:变量重定义
int i;
extern int i;
extern int i=10;
全局静态变量
- 作用域:文件作用域(只在被定义的文件中可见)
- 生命周期:程序运行期一直存在
- 内存分布:全局数据区
- 定义方法:static关键字,const 关键字
- 注意:只要文件不互相包含,在两个不同的文件中是可以定义完全相同的两个静态变量的,它们是两个完全不同的变量
局部变量
- 作用域:局部作用域(只在局部作用域中可见)
- 生命周期:程序运行出局部作用域即被销毁 ,如函数内部
- 内存分布:栈区
静态局部变量
- 作用域:局部作用域(只在局部作用域中可见)。
- 生命周期:程序运行期一直存在
- 内存分布:全局数据区
- 定义方法:局部作用域用中用static定义 (比如用于:被调函数返回指针:此时用static定义的变量在函数调用结束后不释放,可将该static变量的地址作为返回值)
- 注意:只被初始化一次,多线程中需加锁保护