C++中静态变量如何隐藏外部变量
将static限定符用于作用域为整个文件的变量时,该变量的链接性将为内部的。在多文件程序中,内部链接性和外部链接性之间的差别很有意义。链接性为内部的变量只能在其所属的文件中使用:但常规外部变量都具有外部链接性,即可以在其他文件中使用,如前面的示例所示。如果要在其他文件中使用相同的名称来表示其他变量,该如何办呢?只需省略关键字 extem 即可吗?
// file1
int errors = 20; //external declaration
...
---------------------------------------------------
// file2
int errors = 5; //??known to file2 only??
void froobish()
{
cout << errors; //fails
...
}
这种做法将失败,因为它违反了单定义规则。fie2中的定义试图创建一个外部变量,因此程序将包含errors 的两个定义,这是错误。
但如果文件定义了一个静态外部变量,其名称与另一个文件中声明的常规外部变量相同,则在该文件中,静态变量将隐藏常规外部变量:
// file1
int errors = 20; //external declaration
...
---------------------------------------------------
// file2
static int errors = 5; // known to file2 only
void froobish()
{
cout << errors; // uses errors defined in file2
...
}
这没有违反单定义规则,因为关键字 static 指出标识符errors 的链接性为内部,因此并非要提供外部定义。参见【0voice C++】
注意:在多文件程序中,可以在一个文件(且只能在一个文件)中定义一个外部变量。使用该变量的其他文件必须使用关键字 extern 声明它。
可使用外部变量在多文件程序的不同部分之间共享数据;可使用链接性为内部的静态变量在同一个文件中的多个函数之间共享数据(名称空间提供了另外一种共享数据的方法)。另外,如果将作用域为整个文件的变量变为静态的,就不必担心其名称与其他文件中的作用域为整个文件的变量发生冲突。