将static限定符用于作用域为整个文件的变量时,该变量的链接性将为内部的。在多文件程序中,内部链接性和外部链接性之间的差别很有意义。
链接性为内部的变量:只能在其所属的文件中使用。
链接性为外部的变量:可以在其他文件中使用,常规外部变量都具有外部链接性。
举个简单的例子:
在xxx.c或者xxx.cpp文件中定义一个全局变量,全局变量加上static时,这个全局变量只能在当前文件中可见。
错误例子:在其他文件中使用相同的名称来表示其他变量。
//file1 int errors = 20; ... //file2 int errors = 30; void froobish() { cout << errors; }
显然这样是错误的。file2中的定义试图创建一个外部变量,因此程序将包含errors的两个定义。
如果文件定义了一个静态外部变量,其名称与另一个文件中声明的常规外部变量相同,则在该文件中,静态变量将隐藏常规外部变量。
正确例子:
//file1 int errors = 20; ... //file2 static int errors = 30; void froobish() { cout << errors; }
因为关键字static指出标识符errors的链接性为内部,因此并非要提供外部定义。
注意:
1、在多文件程序中,可以在一个文件(且只能在一个文件)中定义一个外部变量。使用该变量的其他文件必须使用关键字etern声明它。
2、可使用外部变量在多文件程序的不同部分之间共享数据.
3、可使用链接性为内部的静态变量在同一个文件中的多个函数之间共享数据。
4、如果将作用域为整个文件的变量变为静态的,不必担心其名称与其他文件中的作用域为整个文件的变量发生冲突。
举个static完整的例子:
file1:
#include <iostream> using namespace std; int tom = 3; int dick = 30; static int harry = 300; void remote_access(); int main() { cout << "main() reports the following addresses: " << endl; cout << &tom << " = &tom, " << &dick << " = &dick, " ; cout << &harry << " = &harry. " << endl; return 0; }
file2:
#include <iostream> using namespace std; extern int tom; static int dick = 10; int harry = 200; void remote_access() { cout << "remote_access() reports the following addresses: " << endl; cout << &tom << " = &tom, " << &dick << " = &dick, " ; cout << &harry << " = &harry. " << endl; }