C++为静态存储持续性提供了3种链接性:外部链接(可在其他文件中访问)、内部链接(只能在当前文件中访问)和无链接(只能在当前函数或代码块中访问)。
编译器将分配固定的内存块来存储所有的静态变量,这些静态变量在整个程序执行期间一直存在。如果没有显式的初始化静态变量,编译器将把它设置为0,在默认情况下,静态数组和结构将每个元素或成员的所有位置都设置为0。
(1)外部链接:必须在代码块的外部声明它;
(2)内部链接:必须在代码块的外部声明它,并使用static限定符;
(3)无链接:必须在代码内声明它,并使用static限定符。
如下面例子:
...
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 funt2()
{
...
}
说明:
(1)静态变量 global、one_file、count在整个程序执行期间都存在;
(2)count:作用域为局部,没有链接性。意味着只能在funct1()函数中使用,就像llama一样。与llama不同的是,即使在funct1()函数没有执行时,count也留在内存中。
(3)global:作用域为整个文件,即在从声明位置到文件结尾的范围内都可以被使用。链接性为外部,因此可以在程序的其他文件中使用他。
(4)one_file:作用域为整个文件,即在从声明位置到文件结尾的范围内都可以被使用。链接性为内部,因此只能在包含上述代码的文件中使用它。
下面对三种链接性的使用进行说明:
(1)静态持续性、外部链接性
如果要在多个文件中使用外部变量,只需在一个文件中包含该变量的定义(单定义规则),但在使用该变量的其他文件中,都必须使用关键字extern声明他:
定义(定义声明):他给变量分配存储空间;
double up;
extern int blem = 10;
声明(引用声明):他不给变量分配存储空间,因为他引用已有的变量;声明使用关键字extern,且不进行初始化,否则声明为定义导致分配存储空间。
extern int blem;
(2)静态持续性、内部链接性
可使用外部变量在多文件程序的不同文件之间共享数据;可使用链接性为内部的静态变量在同一个文件中的多个函数之间共享数据。另外,如果将作用域为整个文件的变量声明为静态的,就不必担心其名称与其他文件中的作用域为整个文件的变量发生冲突。
(3)静态持续性、无链接性
在代码块中使用static时,将导致局部变量的存储持续性为静态的。这意味着虽然该变量只在改代码块中可用,但他在改代码块不处于活动状态时仍然存在。因此在两次函数调用之间,静态局部变量的值将保持不变。另外,如果初始化了静态局部变量,则程序只在启动时进行一次初始化,以后再调用函数时,将不会像自动变量那样被再次初始化。