C static/extern 关键字
深入理解 static 和 extern 对变量和函数作用域及链接属性的影响。 · 难度:入门 · +15XP
存储类说明符
在C语言中,static 和 extern 是存储类说明符,它们控制变量或函数的可见性(作用域)和生命周期。
extern 关键字
extern 用于声明一个变量或函数是在其他文件中定义的,告诉编译器该符号在链接时解析。常用于在多个源文件之间共享全局变量。
// file1.c
int global_var = 42; // 定义全局变量
// file2.c
extern int global_var; // 声明,引用 file1.c 中的变量
void func() {
global_var = 100; // 修改 file1.c 中的变量
}
注意:变量只能定义一次,但可以多次声明。函数默认就是 extern 的,所以通常省略。
static 关键字
static 有两种主要用法:
- 限制作用域:用于全局变量或函数时,将其链接属性从外部(external)改为内部(internal),即只在当前源文件可见。
- 延长局部变量生命周期:用于局部变量时,变量在程序运行期间只初始化一次,并保持其值。
// file1.c
static int hidden_var = 0; // 仅 file1.c 可见
void counter() {
static int count = 0; // 只初始化一次
count++;
printf("%d
", count);
}
表格:static vs extern
| 关键字 | 使用位置 | 效果 |
|---|---|---|
| extern | 变量/函数声明 | 引用其他文件的定义 |
| static | 全局变量/函数 | 限制在当前文件 |
| static | 局部变量 | 延长生命周期,保持值 |
常见错误
- 忘记
extern声明直接使用其他文件的变量,导致链接错误(undefined reference)。 - 同一个全局变量在多个文件中定义(没有
static),导致重复定义错误。
练习提示
在右侧编辑器中,创建两个源文件 a.c 和 b.c。在 a.c 中定义一个全局变量 int value = 10,以及一个 static 函数 static void helper()。在 b.c 中使用 extern 访问 value,并尝试调用 helper(),观察编译结果。