《c语言捡漏系列》static的作用
问题static uint16 abc 和 uint16 abc 一样都是放在.bss段那么static关键字到底起了什么作用它的核心作用不在于“放哪里”而在于“谁能看到它”和“活多久”。static有两个截然不同的应用场景效果完全不同1. 文件作用域全局静态变量—— 隐藏变量如果你在.c文件的最外层所有函数之外写下static uint16_t s_internalFlag;作用限定作用域这个变量只能在当前.c文件中使用。即使其他.c文件用extern声明也链接不到它。防止命名冲突链接器不会将该符号导出到全局符号表。这在大型工程中极其重要——你可以放心地在不同文件中定义同名的static全局变量它们互不干扰。对比不加static全局变量uint16_t g_internalFlag; // 默认是 全局符号其他任何.c文件都可以通过extern uint16_t g_internalFlag;来访问和修改它2. 函数作用域局部静态变量—— 保持状态如果你在函数内部写下void processSignal(void) { static uint16_t s_callCount 0; s_callCount; // ... }作用生命周期变长虽然它写在函数内部但不会像普通局部变量那样分配在栈Stack上。它的内存固定在.bss段程序上电即存在直到断电。值会保持函数退出时s_callCount的值不会丢失。下次进入该函数时它依然是上次退出时的值。作用域受限虽然它在内存中常住但其他函数无法直接访问它只有processSignal内部能看到它。也就是说第二次调用时s_callCount 不会被初始化为 0它会保留第一次调用后递增的值即 1。对比普通局部变量不加 staticvoid processSignal(void) { uint16_t callCount 0; // 每次进入函数都分配在栈上并初始化为 0 callCount; // 退出后销毁永远等于 1 }