有时在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用。这时可以在定义外部变量时加一个static声明。例如:
file1.cpp file2.cpp
static int a=3; extern int a;
int main ( ) int fun (int n)
{ { ┆
┆ a=a*n;
┆
} }
这种加上static声明、只能用于本文件的外部变量(全局变量)称为静态外部变量。这就为程序的模块化、通用性提供了方便。如果已知道其他文件不需要引用本文件的全局变量,可以对本文件中的全局变量都加上static,成为静态外部变量,以免被其他文件误用。
需要指出,不要误认为用static声明的外部变量才采用静态存储方式(存放在静态存储区中),而不加static的是动态存储(存放在动态存储区)。实际上,两种形式的外部变量都用静态存储方式,只是作用范围不同而已,都是在编译时分配内存的。
4.13 变量属性小结


一个变量除了数据类型以外,还有3种属性:
(1) 存储类别 C++允许使用auto,static,register和extern 4种存储类别。
(2) 作用域 指程序中可以引用该变量的区域。
(3) 存储期 指变量在内存的存储期限。
以上3种属性是有联系的,程序设计者只能声明变量的存储类别,通过存储类别可以确定变量的作用域和存储期。
要注意存储类别的用法。auto, static和register 3种存储类别只能用于变量的定义语句中,如
auto char c; //字符型自动变量,在函数内定义
static int a; //静态局部整型变量或静态外部整型变量
register int d; //整型寄存器变量,在函数内定义
extern int b; //声明一个已定义的外部整型变量
说明: extern只能用来声明已定义的外部变量,而不能用于变量的定义。只要看到extern,就可以判定这是变量声明,而不是定义变量的语句。
下面从不同角度分析它们之间的联系。
(1) 从作用域角度分,有局部变量和全局变量。它们采用的存储类别如下:
● 局部变量
自动变量,即动态局部变量(离开函数,值就消失)
静态局部变量(离开函数,值仍保留)
寄存器变量(离开函数,值就消失)
形式参数(可以定义为自动变量或寄存器变量)
● 全局变量
静态外部变量(只限本文件引用)
外部变量(即非静态的外部变量,允许其他文件引用)
(3) 从变量值存放的位置来区分,可分为
● 内存中静态存储区
静态局部变量
静态外部变量(函数外部静态变量)
外部变量(可为其他文件引用)
● 内存中动态存储区: 自动变量和形式参数
● CPU 中的寄存器: 寄存器变量
(4) 关于作用域和存储期的概念。从前面叙述可以知道,对一个变量的性质可以从两个方面分析,一是从变量的作用域,一是从变量值存在时间的长短,即存储期。前者是从空间的角度,后者是从时间的角度。二者有联系但不是同一回事。图4.16是作用域的示意图,图4.17是存储期的示意图。

图4.16

图4.17
评论