static 限制链接为内部,仅本文件可见;extern 声明外部定义,支持跨文件访问;二者互斥,不可共用;默认全局变量具外部链接;const 全局变量在 C++17 前默认 internal linkage。

static 和 extern 都影响变量(或函数)的链接属性(linkage),但作用方向相反:一个限制可见范围,一个扩展可见范围。
static:内部链接,限制在当前翻译单元内
声明为 static 的全局变量或函数,只在定义它的源文件(.cpp)内可见,其他文件无法通过 extern 引用它。即使多个文件都定义了同名 static 变量,它们互不干扰,各自独立存在。
- 全局 static 变量 → 具有内部链接(internal linkage),不进入公共符号表
- 局部 static 变量 → 生命周期延长至程序结束,但作用域仍限于所在函数(这是存储期和作用域问题,与链接无关)
- static 成员变量/函数 → 属于类而非对象,需在类外定义(此时定义不可再加 static)
extern:声明外部定义,支持跨文件访问
extern 本身不分配存储空间,仅表示“这个变量/函数在别处定义”。它用于在当前文件中引用其他翻译单元中定义的非 static 全局实体。
- extern int x; → 告诉编译器 x 在别处定义,链接时去找
- 若同时初始化(如 extern int x = 5;),则变为定义,且隐含 extern "C" 链接(C++ 中)
- extern "C" int func(); → 指定按 C 方式链接,避免 C++ 名字修饰(name mangling)
默认链接规则:不写 static/extern 的全局变量是 extern 的
在命名空间作用域下,未加修饰的全局变量和函数默认具有外部链接(external linkage),等价于显式写 extern(但定义时不能写 extern,否则变成声明)。
立即学习“C++免费学习笔记(深入)”;
- file1.cpp 中:int global = 42; → 定义,外部链接
- file2.cpp 中:extern int global; → 合法声明,可使用 global
- 若 file1.cpp 中写成 static int global = 42; → file2.cpp 中 extern int global; 将链接失败
常见混淆点
extern 和 static 不能同时修饰同一变量(语法错误)。二者逻辑互斥:一个说“我在外面”,一个说“我只在这儿”。另外,const 全局变量默认是 static 链接(C++17 前),这点容易被忽略。
理解链接属性的关键是分清:定义(分配内存)、声明(告知存在)、链接方式(能否跨文件连接)。static 和 extern 主要解决第三个问题。










