/*
内容是从C和指针中摘抄和整理出来的。
*/
1: 作用域
作用域决定程序中该标识符可以被使用的区域。
编译器可以确认四种不同类型的作用域:代码块作用域,函数原型作用域,文件作用域,函数作用域。
1.1代码块作用域
代码块是包含在开始花括号和对应的结束花括号中的一段代码。代码块中定义的变量具有代码块作用域(block scope)。
函数定义的形式参数在函数体内部也具有代码块作用域。
注意:当内层代码块中有一个标识符的名字与外层代码块的一个标识符同名,则外层的那个标识符无法在内层代码块中通过名字访问,即内层的那个标识符会将外层的屏蔽掉。所以避免在嵌套的代码块中出现相同的变量名。
1.2文件作用域
在所有代码块之外声明的标识符都具有文件作用域(file scope)。这表示这些标识符从它们声明之处到所在源文件结尾处都是可以访问的。
1.3原型作用域(prototype scope)
只适用于在函数原型中声明的变量名。作用域从变量定义处到原型声明的末尾。原型作用域防止这些参数名与程序中其他部分的名字冲突。但是要注意:同一个原型中不应该多次使用同一个名字。
1.4函数作用域(function scope)
只适用于标签语句,一般不用。
小结:一般只要注意前面2种。并注意函数定义中声明形参和函数原型中声明参数的区别。
2: 链接属性
链接属性决定如何处理在不同文件中出现的标识符。
链接属性有三种:外部链接external,内部链接internal,空链接none。
2.1 external
external属性的标识符无论声明多少次,位于几个源文件都表示一个实体。
2.2 internal
Internal属性的标识符在同一个源文件的所有声明都指同一个实体。位于不同源文件的多个声明则分属于不同的实体。
2.3 none
none属性的标识符总是被当作单独的个体,即该标识符的多个声明被当作独立不同的实体。
3 : 存储类型 (storage class)
变量的存储类型决定变量何时创建、销毁。有三个地方可以存储变量:普通内层,运行时堆栈,硬件寄存器。变量的缺省存储类型取决于它的声明位置。
3.1 静态变量
在代码块之外声明的变量总是存储于静态内层中。这类变量无法将其指定其他存储类型。
静态变量在程序运行前创建,在程序执行过程中始终存在。
3.2 自动变量
代码块内部声明的变量的缺省类型是自动的。存储于堆栈中,当程序执行到声明自动变量的代码块时,自动变量才被创建。当程序离开相应代码块时,这些自动变量便会自行销毁。
函数的形参是不能声明为静态,因为实参总是在堆栈中传递给函数,用于支持递归。
3.3 寄存器变量
关键字register可以用于自动变量的声明,提示变量存储于寄存器中。
4 : static关键字
1 当用于函数定义,static 关键字修改链接属性,使得函数只能在声明函数的源文件中使用。
2 当用于代码块之外变量的声明时,将变量的链接属性改为internal,但是修改变量的存储类型并不能更改其作用域,仍只能在该代码块内按名字访问。
3 当用于局部变量的声明时,将变量的存储类型改为静态变量。变量的链接属性和作用域不受影响。
5 : external关键字
当用于源文件中第一个标识符的第一次声明时,它指定该标识符具有external链接属性。但是,若用于该标识符的第二次或者以后的声明时,它并不会更改由第一次声明说指定的链接属性。
eg:
static int i;
int func()
{
external int i; //此声明不会改变变量 i 的链接属性
}