C语言中static的含义
C语言中static的含义以及C++中的static关键字有什么区别
static 的主要用用法
- 函数内变量(局部变量):静态存储期,只初始化一次,函数调用结束后不销毁
#include <stdio.h>
void counter() {
static int count = 0; // 只初始化一次
count++;
printf("count = %d\n", count);
}
int main() {
counter(); // count = 1
counter(); // count = 2
counter(); // count = 3
return 0;
}
该变量在函数结束后不消失,存储在静态区而非栈上。
- 文件作用域(全局变量/函数),内部链接:只在当前源文件可见,防止外部链接
// a.c
static int hidden_value = 42; // 不会被其他文件看到
static void internal_function() {
// 只能在 a.c 中调用
}
// b.c
extern int hidden_value; // ❌ 链接失败:hidden_value 是 static,只在 a.c 中可见
static 修饰全局变量或函数时,表示只在当前编译单元(源文件)可见。
- 类中(仅 C++)属于类本身而非对象实例,所有对象共享
#include <iostream>
class MyClass {
public:
static int count; // 所有对象共享
static void showCount() { // 无需对象即可调用
std::cout << count << std::endl;
}
};
int MyClass::count = 0; // 必须在类外定义
int main() {
MyClass::count = 10;
MyClass::showCount(); // 输出 10
}
可以看到前两条C/C++的用法是一样的,核心原因其实是:static变量存在于静态存储区(静态数据段) 使用static修饰过的变量/函数会存在于程序的整个生命周期
避免static在xx.h 头文件中滥用
// header.h
static int counter = 0; // 每个包含的源文件都有一个副本(危险)
// 建议用 inline 或 extern