C++中如何使用静态持续变量

C++中如何使用静态持续变量

和 C语言一样,C++也为静态存储持续性变量提供了3种链接性:外部链接性(可在其他文件中访问)、内部链接性(只能在当前文件中访问)和无链接性(只能在当前函数或代码块中访问)。这3种链接性都在整个程序执行期间存在,与自动变量相比,它们的寿命更长。由于静态变量的数目在程序运行期间是不变的,因此程序不需要使用特殊的装置(如栈)来管理它们。编译器将分配固定的内存块来存储所有的静态变量,这些变量在整个程序执行期间一直存在。另外,如果没有显式地初始化静态变量,编译器将把它设置为0。在默认情况下,静态数组和结构将每个元素或成员的所有位都设置为0。

注意:传统的K&RC不允许初始化自动数组和结构,但允许初始化静态数组和结构。ANSIC和C+允许对这两种数组和结构进行初始化,但有些旧的C++翻译器使用与 ANSIC不完全兼容的C编译器。如果使用的是这样的实现,则可能需要使用这3种静态存储类型之一,以初始化数组和结构。

下面介绍如何创建这3种静态持续变量,然后介绍它们的特点。要想创建链接性为外部的静态持续变量,必须在代码块的外面声明它;要创建链接性为内部的静态持续变量,必须在代码块的外面声明它,并使用 static 限定符;要创建没有链接性的静态持续变量,必须在代码块内声明它,并使用static 限定符。下面的代码片段说明这3种变量:

...
int global = 1000;        //static duration,external linkage
static int one file = 50; //static duration,internal linkage
int main()
{
   ... 
}

void funct1(int n)
{
    static int count=0; //static duration, no linkage
    int llama = 0;
    ...
}

void funct2(int q)
{
    ...
}

正如前面指出的,所有静态持续变量(上述示例中的global、onefile和count)在整个程序执行期间都存在。在 funct1()中声明的变量 count的作用域为局部,没有链接性,这意味着只能在 finctl()函数中使用它,就像自动变量llama一样。然而,与llama不同的是,即使在 functl()函数没有被执行时,count 也留在内存中。global和one_file 的作用域都为整个文件,即在从声明位置到文件结尾的范围内都可以被使用。参见【0voice C++】具体地说,可以在main()、functl()和 funct2()中使用它们。由于 one file 的链接性为内部,因此只能在包含上述代码的文件中使用它;由于global的链接性为外部,因此可以在程序的其他文件中使用它。

所有的静态持续变量都有下述初始化特征:未被初始化的静态变量的所有位都被设置为0。这种变量
被称为零初始化的(zero-initialized)。表9.1总结了引入名称空间之前使用的存储特性。下面详细介绍各种静态持续性。表 9.1指出了关键字 static的两种用法,但含义有些不同:用于局部声明,以指出变量是无链接性的静态变量时,static 表示的是存储持续性;而用于代码块外的声明时,static 表示内部链接性,而变量已经是静态持续性了。有人称之为关键字重载,即关键字的含义取决于上下文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值