C语言extern与static关键字语法及作用说明

一、static 关键字
1. 修饰全局变量/函数
- 作用:指定标识符具有内部链接属性,作用域限定于当前编译单元(.c 文件),其他源文件无法引用;变量存储于静态存储区,生命周期贯穿程序执行全过程。
- 语法示例:
// file_a.c
static int32_t cs1232_zero = 0; // 静态全局变量,仅file_a.c可访问
static void cs1232_reset(void) { // 静态函数,仅file_a.c可调用
cs1232_zero = 0;
}
- 特性:不同源文件可定义同名
static标识符,相互独立无冲突;未显式初始化时,默认初始化为0。
2. 修饰局部变量
- 作用:将局部变量的存储位置改为静态存储区,生命周期延长至程序运行结束,作用域仍限定为当前函数体内。
- 语法示例:
void count_call(void) {
static int cnt = 0; // 仅首次执行初始化
cnt++;
}
- 特性:函数多次调用时,变量保留上一次执行结果。
二、extern 关键字
1. 修饰全局变量/函数
- 作用:指定标识符具有外部链接属性,用于声明外部定义的变量或函数,不分配内存空间,告知编译器该标识符在其他编译单元中定义。
- 语法示例:
// file_a.c
int32_t sensor_value = 0; // 全局变量定义
void sensor_read(void) { // 全局函数定义
}
// file_b.c
extern int32_t sensor_value; // 声明外部全局变量
extern void sensor_read(void); // 声明外部全局函数
- 特性:函数声明默认隐含
extern,可省略;全局变量跨文件访问必须使用extern声明。
三、组合使用规则与示例
- 同一源文件内,
static定义与同名extern声明共存:
static int32_t cs1232_zero = 0;
extern int32_t cs1232_zero;
语法合规,但extern声明无效,变量仍为内部链接属性。
- 跨文件访问约束:
// file_a.c
static int32_t val = 100; // 静态全局变量
// file_b.c
extern int32_t val; // 无效声明,无法访问file_a.c中的静态变量
四、标准工程应用示例
- 模块内部私有(static)
// cs1232.c
static int32_t zero_offset; // 模块内部私有变量
static void calc_zero(void); // 模块内部私有函数
- 跨文件接口(extern)
// cs1232.h
extern int32_t cs1232_data; // 对外接口变量声明
extern void cs1232_init(void); // 对外接口函数声明
// cs1232.c
int32_t cs1232_data = 0; // 对外接口变量定义
void cs1232_init(void) { // 对外接口函数定义
}
总结
- static:标识内部链接,作用域仅限当前文件,用于模块私有化。
- extern:标识外部链接,用于声明外部定义的变量/函数,支持跨文件访问。
- static 标识符无法被外部文件通过 extern 引用;同一文件内 static 定义后,extern 声明无实际作用。
905

被折叠的 条评论
为什么被折叠?



