C语言中的static和extern:一分钟搞懂作用域与生命周期
别被关键字吓到,其实它们就管两件事:谁能用和用多久
一、先扔结论
extern:告诉编译器“这个变量/函数在别处定义了,你尽管用”
static:把变量/函数“锁”在当前文件或函数内,别人碰不到
二、static 的三种用法
1. 修饰局部变量 —— “延长寿命”
void count() { static int num = 0; // 只初始化一次 num++; printf("%d ", num); } int main() { count(); // 1 count(); // 2 count(); // 3 }普通局部变量函数结束就销毁,但 static 让它的生命周期持续到程序结束,作用域却仍然只在函数内。适合做计数器、缓存等。
2. 修饰全局变量 —— “内部专用”
// file1.c static int g_val = 42; // 只有 file1.c 能访问 // file2.c extern int g_val; // 编译报错!外部看不到全局变量本来所有文件可见,加上 static 就变成文件私有,防止命名冲突。
3. 修饰函数 —— “隐藏细节”
// helper.c static void secret() { // 内部工具函数 // ... } void public() { // 对外暴露 secret(); }跟静态全局变量同理,函数加 static 后只能在本文件内调用,外部 extern 也找不到。
三、extern —— “借用一下”
场景:多文件共享全局变量/函数
// global.c int score = 100; // 定义 // main.c extern int score; // 声明(不是定义!) int main() { printf("%d", score); // 可以使用 }extern 只是声明,告诉编译器“这个符号在其他文件里定义过,链接时去找”。不分配内存,只是引用。
同样用于函数(函数默认就是 extern,所以通常省略):
// utils.c void foo() { ... } // main.c extern void foo(); // 可写可不写,默认就是外部链接 foo();四、对比总结
| 关键字 | 作用域 | 生命周期 | 主要用途 |
| static 局部变量 | 函数内 | 程序全程 | 保留状态 |
static全局变量 | 本文件 | 程序全程 | 文件私有数据 |
static函数 | 本文件 | 程序全程 | 内部工具函数 |
extern变量/函数 | 全局(需声明) | 程序全程 | 跨文件共享 |
五、记忆口诀
static 是“锁”:锁在函数内(寿命长),锁在文件内(外人看不见)
extern 是“借”:借别人的定义来用,不自己造
六、避坑提醒
1.static 局部变量只能常量初始化(C语言),且初始化只执行一次。
2.头文件中不要定义全局变量(容易重复定义),应放 .c 文件,用 extern 在头文件中声明。
3.函数不写 static 默认全局可见,写了就“隐身”。
最后贴个经典面试题:
static 全局变量和普通全局变量的区别?
答:作用域不同,静态全局变量仅限于本文件,普通全局变量可被 extern 跨文件访问。
好了,就这么多,以后看到 static 和 extern 别再懵了!😎
如果你觉得有帮助,欢迎点赞、收藏、评论,让更多人看到!