static
2026/7/1大约 2 分钟
static

驱动开发中的 static
在 STM32 驱动开发中,凡是仅供当前模块内部使用的文件作用域变量和函数,都应优先声明为 static。只有确实需要跨模块访问的对象,才考虑通过 .h 中的 extern 或公共 API 对外暴露。
对于文件作用域变量,static 最核心的作用不是“让变量永久存在”,而是改变其链接属性(linkage):使其从默认的 external linkage(外部链接) 变成 internal linkage(内部链接)。
编译器将 .c 文件分别编译成 .o 目标文件后,static 对象在符号表中通常表现为 LOCAL symbol,而普通的外部全局符号通常表现为 GLOBAL symbol。链接器在解析跨目标文件的符号引用时,只会使用符合外部链接规则的全局定义,因此其他 .c 文件无法通过符号名解析到这个 static 对象。
因此,static 可以理解成给模块内部符号加了一层“链接级隐身衣”:
static
↓
internal linkage
↓
LOCAL symbol
↓
链接器不向其他 translation unit 提供该符号
↓
模块内部实现细节同时,文件作用域变量本身就具有 static storage duration(静态存储期),因此其生命周期贯穿整个程序运行过程。它最终通常位于 .bss 或 .data 等静态存储区域,而不是函数调用产生的栈帧中。
所以需要严格区分:
static 文件作用域变量
│
├── internal linkage → 解决“谁能通过名字找到我”
│
└── static storage duration → 解决“我存在多久”这正是 C 语言实现模块化、封装内部状态的重要机制。

