《c语言捡漏系列》static的作用

问题:static uint16 abc 和 uint16 abc 一样都是放在.bss段,那么static关键字到底起了什么作用?

它的核心作用不在于"放哪里",而在于"谁能看到它"和"活多久"。static有两个截然不同的应用场景,效果完全不同:

1. 文件作用域(全局静态变量)------ 隐藏变量

如果你在 .c 文件的最外层(所有函数之外)写下:

cpp 复制代码
static uint16_t s_internalFlag;

作用:

  • 限定作用域 :这个变量只能 在当前 .c 文件中使用。即使其他 .c 文件用 extern 声明,也链接不到它。

  • 防止命名冲突 :链接器不会将该符号导出到全局符号表。这在大型工程中极其重要------你可以放心地在不同文件中定义同名的 static 全局变量,它们互不干扰。

对比不加 static(全局变量):

cpp 复制代码
uint16_t g_internalFlag;  // 默认是 "全局符号"

其他任何.c文件都可以通过extern uint16_t g_internalFlag; 来访问和修改它

2. 函数作用域(局部静态变量)------ 保持状态

如果你在函数内部写下:

cpp 复制代码
void processSignal(void) {
    static uint16_t s_callCount = 0;
    s_callCount++;
    // ...
}

作用:

  • 生命周期变长 :虽然它写在函数内部,但不会 像普通局部变量那样分配在栈(Stack)上。它的内存固定在 .bss 段,程序上电即存在,直到断电。

  • 值会保持 :函数退出时,s_callCount 的值不会丢失。下次进入该函数时,它依然是上次退出时的值。

  • 作用域受限 :虽然它在内存中常住,但其他函数无法 直接访问它,只有 processSignal 内部能看到它。

  • 也就是说第二次调用时,s_callCount 不会被初始化为 0,它会保留第一次调用后递增的值(即 1)。

对比普通局部变量(不加 static):

cpp 复制代码
void processSignal(void) {
    uint16_t callCount = 0; // 每次进入函数都分配在栈上,并初始化为 0
    callCount++; // 退出后销毁,永远等于 1
}
相关推荐
CRMEB系统商城15 分钟前
家电零售的供应商协同与物流提效
java·开发语言·人工智能·小程序·1024程序员节
Pointer Pursuit26 分钟前
Linux环境变量
linux·服务器·c语言·链表·1024程序员节
王大师王文峰28 分钟前
Java+AI 面试题(二):业务场景设计 10 例【客服机器人、合同审查、Text2SQL、告警降噪、成本优化】场景题答法与追问链路
java·开发语言·人工智能
言乐637 分钟前
Python实现三轴联动根据数据自动打磨镜片模型
开发语言·python
CHHH_HHH1 小时前
【Linux网络篇】初识网络与Socket编程基础
linux·服务器·c语言·开发语言·网络·后端·1024程序员节
思麟呀1 小时前
BTree的原理与 C++ 完整实现
c语言·数据结构·c++·算法·1024程序员节
jimy11 小时前
C++ 中 xvalue 的 identity 存在哪里?和 lvalue 的 identity 有什么区别?
开发语言·c++·1024程序员节
yujunl1 小时前
U9 无授权的模式WebAPI开发的总结
开发语言·1024程序员节
zzu123zsw1 小时前
为什么 Python 做 Agent 总在并发中崩溃?拆解 Blockcell 在 Rust 下的 Host-Cell 隔离与自愈状态机
开发语言·python·rust·大模型·ai agent
xiaoye-duck2 小时前
《C++ 项目:手写大模型接入 SDK》Provider分析与实现
开发语言·c++·语言模型