首页 > 学院 > 开发设计 > 正文

静态持续变量

2019-11-14 08:48:25
字体:
来源:转载
供稿:网友

C++为静态存储持续性变量提供了三种链接性。

外部链接性:可在其它文件中访问;声明不在任何函数内。

内部链接性:只能在当前文件中访问;声明不在任何函数内,使用关键字static。

无链接性:只能在当前函数或代码块中访问;声明在代码块中,使用关键字static。

这三种链接性在整个程序执行期间存在,与自动变量相比(栈中),寿命更长。编译器将分配固定的内存块来存储错有的静态变量。

如果没有显式地初始化静态变量,编译器将把它设置为0。在默认下,静态数组和结构将每个元素或成员的所有位都设置为0。当然如果加了显式初始化,将被赋予相应的值。

使用外部链接变量(全局变量)要注意单定义规则:即变量只能由一次定义。因此由定义声明和引用声明两种声明方法。定义声明将给变量分配存储空间,引用声明不分配,只是引用已有的变量。

引用声明使用关键字extern,且不进行初始化;否则声明为定义,导致分配存储空间。如果要在多文件中使用外部变量。只需在一个文件中包含该变量的定义,但在使用该变量的其它文件中,都必须使用关键字extern。

注意,如果函数中声明了一个与外部变量同名的变量,则将视为自动变量的定义,即自动变量将隐藏同名的全局变量。

当然,可以使用::作用域解析运算符使用变量的全局版本。

注意const全局变量的链接性为内部。在C++看来,全局const定义就像使用了static说明符一样。延伸出一种用法:通常将常量定义(例如pi)放在头文件中,如:

const double pi = 3.1415;

每个文件包括该头文件,并用extern引用声明使用该常量,由于链接性变为内部,每个文件都由自己私有的一组常量。如果处于某种原因希望链接性为外部,需要用extern覆盖默认的内部链接性:

extern const int count = 1;

然后在使用该常量的文件中用extern声明引用它。这与常规外部变量不同,定义时不用使用extern,请注意区分。

补充:所有函数默认都是静态的,外部链接性,即文件间共享。如果希望是内部链接性的,应该用static声明和定义。这种情况下,编译器在该文件中查找函数定义;否则在所有程序文件中查找。如果找不到,则在标准库中搜索。因此如果定义了一个与库函数同名的函数,编译器将选择程序员定义的版本,而不是库函数。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表