一般情况下,在文件作用域 file scope 内的所有名字对程序中的所有翻译
单元来说都是可见的
这就是外部连接 external linkage,因为在连接时这个名字对连接器来说是
可见的,对单独的翻译单元来说,是外部的
有时可能想限制一个名字的可见性。想让一个变量在文件范围内是可见的,这样
这个文件中的所有函数都可以使用它,但不想让这个文件之外的函数看到或
访问该变量,或不想这个变量的名字与外部的标识符相冲突
在文件作用域内,一个被明确声明为static的对象或函数的名字对翻译单元
来说是局部于该单元的
内部连接的一个好处是这个名字可以放在一个头文件中而不用担心连接时发生
冲突。
那些通常放在头文件里的名字,如常量、内联函数,在默认情况下都是内部
连接的
所有的全局对象都是隐含在静态存储的
int a = 0
a被存储在程序的静态数据区,在进入mian()函数之前,a已经初始化了
一旦进入局部变量,static就不会再改变变量的可见性,只是改变变量的
存储类型
如果把局部变量声明为extern,这意味着某处已经存在一个存储区
//: C10:LocalExtern.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
//{L} LocalExtern2
#include <iostream>
int main() {
extern int i;
std::cout << i;
getchar();
} ///:~
//: C10:LocalExtern2.cpp {O}
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
int i = 5;
///:~
static和extern只会改变它们的可见性
输出
5