C中存储类,链接,作用域
C中变量按照不同的标准有不同的分类方式,总的来说主要有三大类:存储周期,作用域,链接。
作用域:
作用域描述了程序中可以访问一个标志符的一个或多个区域。目前主要包括以下:
文件作用域:在所有函数之外定义的变量具有文件作用域。
函数原型作用域:从变量定义到原型声明的末尾。注意此时可以不写变量具体名称,编译器只关注变量的类型,如下(两者等价):
int showtime ( int time); int showtime ( int );
代码块作用域:在某一函数代码段内定义的变量具有代码块作由域,当程序离开该代码块后变量失去作用。
链接:
一个c变量具有以下链接之一:外部链接,内部链接或空链接
具有代码块和函数原型的存储周期的变量具有空链接,这意味着他们是有其定义所在的代码块或函数原型所私有的。具有文件作用域的变量可能具有外部链接或内部链接。一个具有外部链接的变量在一个程序包含的多个文件中任意使用;具有内部链接的变量只能在本文件内部的所有函数内使用。内部链接是通过关键字static来说明:
int time=6; //文件作用域,外部链接 static int time=6; //文件作用域,内部链接 int main() { … }
存储周期:
一个c变量具有两种存储周期:静态存储周期和自动存储周期,如果一个变量具有静态存储周期,它在程序执行期间将一直存在。具有文件作用域的变量具有静态存储周期;而具有代码块作用域的变量一般具有自动存储周期,当程序进入定义这些变量的代码块时,将为这些变量分配内存,当退出这个代码时将释放其内存。
C根据以上这个概念定义了5个存储类,如下:
存储类 |
时期 |
作用域 |
链接 |
声明方式 |
自动 |
自动 |
代码块 |
空 |
代码块内 |
寄存器 |
自动 |
代码块 |
空 |
代码块内,使用关键字register |
具有外部链接的静态 |
静态 |
文件 |
外部 |
所有函数之外 |
具有内部链接的静态 |
静态 |
文件 |
内部 |
所有函数之外,使用static |
空链接静态 |
静态 |
代码块 |
空 |
代码块内,使用static |
注意:
说明符static在用于具有代码块作用域的变量时,使该变量具有静态存储周期,从而使其在程序运行期间一直存在,该变量具有代码块作用域和空链接。当static用于文件作用域的变量的声明时,表明该变量具有内部链接。当使用static声明或定义一个函数时,表明创建为一个特定模块所私有的函数,从而避免可能的名字冲突。