生命周期和作用域

参考资料

http://blog.csdn.net/yunyun1886358/article/details/5632087
http://m.blog.csdn.net/article/details?id=48048965

C/C++谈及作用域与生命周期针对的就是这三大程序的组成要素:函数、数据类型和变量。

作用域与生命周期是完全两个不同的概念。

在英文中个,作用域用“scope”表示,生命周期则用“duration”表示。作用域是一个静态概念,只在编译源程序的时候用到。一个标识符的作用域指在源文件中该标识符能够独立地合法出现的区域。生命周期则是一个运行时(Runtime)概念,它是指一个变量在整个程序从载入到结束运行的过程中存在的时间周期。由于函数和数据类型是静态的概念,它们没有生命周期的说法,它们从编译时、程序的运行到结束整个过程是一直存在的。

C中作用域的级别主要有文件作用域(全局作用域)、函数作用域和代码块作用域(局部作用域)。

存储类型限定

C语言中提供了存储说明符auto,register,extern,static说明的四种存储类别。四种存储类别说明符有两种存储期:自动存储期和静态存储期。其中auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块是被建立,它在该程序块活动时存在,退出该程序块时撤销。静态存储期从程序载入运行到程序结束一直存在。

变量的生命周期和作用域

变量主要分为全局变量、全局静态变量、局部变量和局部静态变量。

全局变量

全局变量:

  • 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件);
  • 生命周期:程序运行期一直存在;
  • 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量。;
  • 内存分布:全局/静态存储区;
  • 注意:如果在两个文件中都定义了相同名字的全局变量,链接出错:变量重定义。

全局静态变量

全局静态变量:

  • 作用域:文件作用域(只在被定义的文件中可见);
  • 生命周期:程序运行期一直存在;
  • 内存分布:全局/静态存储区;
  • 定义方法:static关键字,const 关键字;
  • 注意:只要文件不互相包含,在两个不同的文件中是可以定义完全相同的两个静态变量的,它们是两个完全不同的变量。

局部非静态变量

局部变量:

  • 作用域:局部作用域(只在局部作用域中可见,如函数域,代码块域);
  • 生命周期:程序运行出局部作用域即被销毁;
  • 内存分布:栈区;
  • 注意:auto指示符标示。

局部静态变量

函数的作用域