C++ 为静态存储持续性变量提供了3种链接性:外部链接性、内部链接性和无链接性。
这3种链接性在整个程序运行期间都存在,与自动变量相比,它们的寿命更长。由于静态变量的数目在程序运行期间是不变的,因此程序不需要使用特殊的装置(如堆栈)来管理他们。编译器将分配固定的内存块来存储所有的静态变量,这些变量在整个程序运行期间一直存在。
如果没有显式地初始化静态变量,编译器将把它设置为0。默认情况下,静态数组和结构将每个元素或成员的所有位都设置为0。
三种静态持续变量的创建:
- 要想创建链接性为外部的静态持续变量,必须在代码块外面声明它;
- 要想创建链接性为内部的静态持续变量,必须在代码块外面声明它,并且使用static限定符;
- 要想创建没有链接性的静态持续变量,必须在代码块内声明它,并且使用static限定符。
三种静态持续变量的例子:
……
int NUM_ZDS_GLOBAL = 80; //#1
static int NUM_ZDS_ONEFILE = 50; //#2
int main(){
…
}
void fun1(int n){
static int nCount = 0; //#3
int nNum = 0; //#4
}
void fun2(int q){
…
}
#1、#2、#3 在整个程序运行期间都存在。在 fun1 中声明的 #3 的作用域为局部,没有链接性,这意味着只能在 fun1 函数中使用它,就像自动变量 #4 一样。但是,与 #4 不同的是,即使在 fun1 没有被执行的时候,#3 也保留在内存中。
#1、#2 的作用域为整个文件,即在声明的位置开始到文件末尾的范围内都可以被使用。
具体地说,可以在 main、fun1、fun2 中使用它们。由于 #2 的链接性为内部,因此只能在包含上述代码的文件中使用它;由于 #1 的链接性为外部,因此可以在程序的其他文件中使用它。
所有的静态持续变量都具有下面两个特征:
- 未被初始化的静态变量的所有位都被设置为0;
- 只能使用常量表达式来初始化静态变量。
常量表达式可以使用字面值常量、const 常量和 enum 常量以及 sizeof 操作符。
网友评论