嵌入式C语言四个常用关键字
前言
在嵌入式C语言中,static、extern、volatile、const 是关键修饰符,各自有不同的作用和应用场景:
一、关键字 static
-
作用:控制变量或函数的作用域和生命周期。
-
用法:
① 局部变量:
在函数内声明时,变量在程序整个生命周期内保持值(只初始化一次),但作用域仍限于函数内。
代码如下(示例):void func() { static int count = 0; // 仅初始化一次,函数退出后值保留 count++; }② 全局变量/函数:
在文件内声明时,限制其作用域仅限当前文件(避免被其他文件通过extern引用)。
代码如下(示例):static int local_var; // 仅当前文件可见 static void helper() { ... } // 仅当前文件可调用 -
嵌入式应用场景:
用于保持状态(如中断计数器)、封装模块内部数据(避免全局变量被外部误改)。
二、关键字 extern
-
作用:
声明变量或函数在其他文件中定义,提示编译器去外部寻找定义。
-
用法:
extern int global_var; // 声明变量,定义在其他文件 extern void init(); // 声明函数,定义在其他文件 -
嵌入式应用场景:
用于多文件项目,共享硬件寄存器地址或模块接口(如extern volatile uint32_t *REG_PORT_A;)。
三、关键字 volatile
-
作用:
告诉编译器变量可能意外改变(如硬件寄存器、中断共享变量),禁止优化(如缓存到寄存器)。
注:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。就是说,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
-
用法:
volatile uint8_t *status_reg = (uint8_t *)0x1234; // 硬件寄存器 volatile bool flag = false; // 可能被中断修改 -
嵌入式场景:
访问内存映射的硬件寄存器(如volatile uint32_t *GPIO_DATA)。
多线程/中断中共享的变量(避免编译器优化导致读取旧值)。
四、关键字 const
-
作用:
定义只读变量或常量指针,值不可修改。
-
用法:
代码如下(示例):
const float PI = 3.14159; // 常量值 const uint8_t *ptr = &data; // 指针指向的数据不可改 uint8_t *const ptr = &data; // 指针本身不可改(固定地址) -
嵌入式场景:
用const来防止误操作:
C++例子:
//学生结构体定义 struct student { //成员列表 string name; //姓名 int age; //年龄 int score; //分数 }; //const使用场景 void printStudent(const student *stu) //加const防止函数体中的误操作 { //stu->age = 100; //操作失败,因为加了const修饰(加入const之后,一旦有修改操作就会报错,可以防止我们的误操作) cout << "姓名:" << stu->name << " 年龄:" << stu->age << " 分数:" << stu->score << endl; } int main() { student stu = { "张三",18,100 }; printStudent(&stu); system("pause"); return 0; }配置参数(如const int MAX_TEMP = 100;)。
保护硬件寄存器(如const volatile uint32_t *READ_ONLY_REG)。
【补充】指针常量和常量指针
const修饰指针有三种情况:
- const修饰指针 — 常量指针
- const修饰常量 — 指针常量
- const即修饰指针,又修饰常量
int main() {
int a = 10;
int b = 10;
//const修饰的是指针,指针指向可以改,指针指向的值不可以更改
const int * p1 = &a;
p1 = &b; //正确
//*p1 = 100; 报错
//const修饰的是常量,指针指向不可以改,指针指向的值可以更改
int * const p2 = &a;
//p2 = &b; //错误
*p2 = 100; //正确
//const既修饰指针又修饰常量
const int * const p3 = &a;
//p3 = &b; //错误
//*p3 = 100; //错误
system("pause");
return 0;
}
技巧:看const右侧紧跟着的是指针还是常量, 是指针就是常量指针,是常量就是指针常量
总结
| 关键字 | 核心作用 | 典型嵌入式应用场景 |
|---|---|---|
| static | 限制作用域/保持生命周期 | 模块封装、状态保持 |
| extern | 声明外部定义 | 多文件共享硬件/函数 |
| volatile | 禁止优化 | 硬件寄存器、中断共享变量 |
| const | 只读保护 | 配置参数、只读硬件寄存器 |

1251

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



