5种变量存储方式
存储描述 | 持续性 | 作用域 | 链接性 | 如何声明 |
自动 | 自动 | 代码块 | 无 | 在代码块中(可使用关键字 auto) |
寄存器 | 自动 | 代码块 | 无 | 在代码块中,使用关键字register |
静态,无链接性 | 静态 | 代码块 | 无 | 在代码块中,使用关键字static |
静态,外部链接性 | 静态 | 文件 | 外部 | 在函数外面 |
静态,内部链接性 | 静态 | 文件 | 内部 | 在函数外面,使用关键字static |
按
存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区,寄存器变量存放在CPU的寄存器中。
链接性为
外部的变量通常简称为
外部变量,它们的存储持续性为静态,作用域为整个文件。外部变量是在函数外部定义的,因此对所有函数而言都是外部的。
链接性为
内部的变量只能在其所属的文件中使用;但常规外部变量都具有外部链接性,即可以在其他文件中使用。对于外部链接性变量,有且只有一个文件中包含了该变量的外部定义。其他文件要使用该变量,必须在引用声明中使用关键字
extern。
再谈
const
在C++中,const限定符对默认存储类型稍有影响。在默认情况下全局变量的链接性为外部的,但const全局变量的链接性为内部的。也就是说,在C++看来,全局const定义就像使用了static说明符一样。
只能有一个文件可以包含前面的声明,而其他文件必须使用extern关键字来提供引用声明,只有未使用extern关键字的声明才能进行初始化:
extern const int fingers; //can't be initialized
如果出于某种原因,程序员系统某个敞亮的链接性为外部的,则可以使用extern关键字来覆盖默认的内部连接性:
extern const int states = 50; //external linkage