Cantian connector for MySQL完全指南:从零开始构建MySQL高性能集群的5个步骤
2026/7/5 8:09:52
static是存储修饰符,作用分全局变量、局部变量、函数三种场景,核心两个能力:
c
运行
void func(void) { int a = 0; // 存栈Stack,函数调用时创建,退出直接销毁 a++; printf("%d ", a); }调用多次输出:1 1 1 1
c
运行
void func(void) { static int a = 0; // 存.bss/.data段,只初始化1次 a++; printf("%d ", a); }调用多次输出:1 2 3 4
a;c
运行
int g_val = 10; // 存.data段,整个工程所有.c文件都能extern访问工程任意文件写extern int g_val;就能跨文件读写。
c
运行
static int g_val = 10; // 存.data段,仅限当前.c文件使用.c文件无法通过extern引用,杜绝跨文件重名冲突;c
运行
void TestNtc(void) { }整个工程任意文件都能直接调用。
c
运行
static void TestNtc(void) { }表格
| 写法 | 内存区域 | 生命周期 | 作用域 |
|---|---|---|---|
函数内int a | 栈 Stack | 函数单次调用 | 仅当前函数 |
函数内static int a | .bss/.data | 整个程序运行 | 仅当前函数 |
文件外int g_a | .bss/.data | 整个程序运行 | 全工程所有文件 |
文件外static int g_a | .bss/.data | 整个程序运行 | 仅限当前.c 文件 |
普通函数void func() | 代码段 Flash | 程序运行 | 全工程可调用 |
static void func() | 代码段 Flash | 程序运行 | 仅限当前.c 文件 |
c
运行
uint16_t Ntc_GetAdc(void) { static uint16_t filter_buf[8]; // 静态数组,不占栈,保存历史采样 static uint8_t idx = 0; uint16_t adc = ADC_Read(); filter_buf[idx++] = adc; idx %= 8; // 均值滤波计算... }不加 static 的话,filter_buf在栈,数组大了直接栈溢出。
c
运行
// ntc.c 文件内,其他文件无法访问这个表 #ifdef NTC_R_10K static const uint16_t ntc_code[] = {0x01C4,0x023B,...}; #elif defined(NTC_R_100K) static const uint16_t ntc_code[] = {0xXXXX,...}; #endifc
运行
// 查表转换温度,外部文件不能调用 static int Ntc_CodeToTemp(uint16_t adc) { // 二分查表逻辑 } // 对外提供的接口,不加static,其他文件可调用 int Ntc_GetTemp(void) { uint16_t adc = Ntc_ReadAdc(); return Ntc_CodeToTemp(adc); }static const常量:static const:存.rodata只读 Flash,不占 RAM;static const:同样存在只读区,不会每次进函数重复分配。c
运行
static int a = 10; // 仅上电执行一次 a = 10; // 每次调用都会重新赋值,覆盖记忆值static修饰,转移到全局 RAM,不占用栈。static;