6月1日 14:42

C语言 static 关键字有什么用?修饰变量和函数分别什么效果?

static 在 C 语言里有三个作用:修饰局部变量让它持久化、修饰全局变量限制作用域、修饰函数限制可见性。记住一个规律——static 总是在"收窄"什么:局部变量收窄不了作用域(已经最窄了),就延长生命周期;全局变量和函数收窄可见范围到当前文件。

追问

static 局部变量和全局变量有什么区别?

存储位置一样,都在 .data 或 .bss 段,生命周期都是程序运行全程。区别在作用域:static 局部变量只在函数内可见,全局变量整个文件可见。换句话说,static 局部变量就是"只有这个函数能用的全局变量"。

c
int* get_counter() { static int count = 0; // 只初始化一次,值持久化 return ++count; // 每次调用 +1 }

static 全局变量和普通全局变量有什么区别?

普通全局变量是外部链接,其他文件通过 extern 能访问。static 全局变量是内部链接,只能在定义它的 .c 文件内使用。效果就是命名隔离——多个文件可以有同名的 static 全局变量,互不冲突。

static 函数有什么用?

和 static 全局变量一个道理:限制到文件内部。好处是:避免和其他文件的同名函数冲突,编译器可以做更激进的内联优化(因为确定不会被外部调用)。在大型项目里,内部辅助函数都应该加 static,这是基本的模块封装手段。

static 变量是线程安全的吗?

不是。多个线程同时访问同一个 static 局部变量,和访问全局变量一样需要同步。C11 引入了 _Thread_local,可以给每个线程一份独立的 static 变量副本,但这不是 C89/C99 的特性。实际项目中,static 局部变量配合 mutex 是常见的线程安全模式。

static 和 const 有什么区别?

static 管的是作用域和生命周期("谁能看到我""活多久"),const 管的是可修改性("能不能改我")。两者可以组合:static const int MAX = 100; 表示文件内可见、不可修改的常量,替代 #define 更类型安全。

写段代码

c
// counter.c — static 封装示例 static int count = 0; // 文件私有,外部不可见 int counter_next() { return ++count; } int counter_get() { return count; } void counter_reset() { count = 0; } // 外部只能通过这三个函数操作 count
标签:C语言