C语言:标识符的作用域、链接属性以及变量的存储类型
1. 标识符的作用域(scope)
标识符的作用域决定了标识符在本编译单元的可见范围(哪里可以被使用)。
1.1 block scope(代码块作用域)
位于一对花括号之间的所有语句被称为一个代码块(block)。任何在block内声明的标识符都拥有代码块作用域(block scope),这表示标识符从它们声明之初到其所在block结尾都是可见的。当block于嵌套状态时,声明于内层block的标识符的作用域到达该内层block结尾便告终止。
1.2 file scope(文件作用域)
处在所有代码块之外的标识符具有文件作用域(file scope),这表示标识符从它们声明之初到其所在文件的结尾处都是可见的。
原型作用域(prototype scope)和函数作用域(function scope)这两个概念很少用到,或者我本人没有认识到它们的重要性,本着面向实际工程而非刻板地学习语言标准的原则,此处略过。
2. 标识符的链接属性(linkage)
标识符的链接属性(linkage)决定标识符指向的实体。
2.1 external链接属性
具有externel链接属性的标识符不论位于多少个编译单元、被声明多少次都指向同一个全局的实体。
2.2 internal链接属性
具有internel链接属性的标识符指向编译单元内(非全局)的实体。
3. 变量的存储类型(storage class)
变量的存储类型(storage class)决定变量的生命周期。
3.1 静态变量
在任何代码块之外声明的变量是静态变量,存储在可执行文件数据段(.data)或.bss段中。静态变量在程序运行之前创建,在程序执行结束后销毁。
3.2 局部变量
在代码块内部声明的变量的缺省存储类型是局部变量,存储于运行栈中。当程序执行到声明局部变量的代码块的声明语句时,局部变量才被创建,当程序的执行流离开该代码块时,这些局部变量便自行销毁。如果该代码块被执行多次,则这些局部变量每次都将重新创建。
3.3 寄存器变量
存储在硬件寄存器中,一般用作代码优化,这里不展开阐述。