测试环境:Visual Studio Community 2019
作用域
有四种不同类型的作用域----文件作用域,函数作用域,代码块作用域和原型作用域。
- 代码块作用域:位于一对花括号之间的所有语句称为一个代码块,代码块开始声明的具有~。
- 文件作用域:任何在所有代码块之外声明的标识符都有~。
- 原型作用域:只适用于在函数原型中声明的参数名。
- 函数作用域:只适用于语句标签,语句标签用于goto语句。
链接属性
链接属性一共有三种:external,internal和none。
-
external:无论声明多少次,几个源文件中的声明都表示同一实体;
-
internal:只有同一文件内才为同一实体;
-
none:多个声明被当作独立不同的实体;
-
在缺省情况下,文件作用域内(不存在于任意函数内)的变量或函数为external。如果在它前面加上static可以使它的链接属性变为internal,例如:
static int a;
那么变量a就是这个源文件所私有。
-
static 只对缺省链接属性为external的声明才有改变链接属性的效果。
-
extern关键字,只能用于声明变量,不能用于定义(除非声明时有初始化,才被当作定义)。当缺省时既可以为声明,也可以是定义。
int a; extern int b; extern int c=10;
a:即是声明又是定义,b:只是声明,c:定义。
存储类型
有三个地方可用于存储变量:普通内存,运行时堆栈,硬件寄存器。
- 所有代码块之外声明的变量总是存储在静态内存中,这类变量称为静态变量,静态变量在程序运行之前创建,整个执行过程中都存在。静态变量会被初始化为0。
- 代码块内部声明的变量的存储类型是自动的,也就是说它存储在堆栈中。自动变量在代码块执行到此块时自动变量才被创建,执行完毕后就消失。
regiser
提示他们应该存储于机器的硬件寄存器而不是内存中。这类变量称为寄存器变量。
当static修饰代码块内部的变量声明时,会将自动变量修改为静态变量,但链接属性和作用域不受影响。