嵌入式C语言四个常用关键字


前言

在嵌入式C语言中,static、extern、volatile、const 是关键修饰符,各自有不同的作用和应用场景:


一、关键字 static

  1. 作用​​:控制变量或函数的​​作用域​​和​​生命周期​​。

  2. ​​用法​​:
    ​​① 局部变量​​:
    在函数内声明时,变量在程序整个生命周期内保持值(只初始化一次),但作用域仍限于函数内。
    代码如下(示例):

    void func() {
        static int count = 0; // 仅初始化一次,函数退出后值保留
        count++;
    }
    

    ② ​​全局变量/函数​​:
    在文件内声明时,限制其作用域仅限当前文件(避免被其他文件通过extern引用)。
    代码如下(示例):

    	static int local_var; // 仅当前文件可见
    	static void helper() { ... } // 仅当前文件可调用
    
  3. 嵌入式应用场景​​:

    用于保持状态(如中断计数器)、封装模块内部数据(避免全局变量被外部误改)。


二、关键字 extern

  1. ​​作用​​:

    声明变量或函数​​在其他文件中定义​​,提示编译器去外部寻找定义。

  2. ​​用法​​:

    extern int global_var; // 声明变量,定义在其他文件
    extern void init();    // 声明函数,定义在其他文件
    
  3. ​​嵌入式应用场景​​:
    用于多文件项目,共享硬件寄存器地址或模块接口(如extern volatile uint32_t *REG_PORT_A;)。


三、关键字 volatile

  1. ​​作用​​:

    告诉编译器变量可能​​意外改变​​(如硬件寄存器、中断共享变量),禁止优化(如缓存到寄存器)。

    注:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。就是说,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

  2. 用法​​:

    volatile uint8_t *status_reg = (uint8_t *)0x1234; // 硬件寄存器
    volatile bool flag = false; // 可能被中断修改
    
  3. 嵌入式场景​​:

    访问内存映射的硬件寄存器(如volatile uint32_t *GPIO_DATA)。
    多线程/中断中共享的变量(避免编译器优化导致读取旧值)。


四、关键字 const

  1. 作用​​:

    定义​​只读变量​​或​​常量指针​​,值不可修改。

  2. ​​用法​​:

    代码如下(示例):

    const float PI = 3.14159;       // 常量值
    const uint8_t *ptr = &data;     // 指针指向的数据不可改
    uint8_t *const ptr = &data;     // 指针本身不可改(固定地址)
    
  3. ​​嵌入式场景​​:

    用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修饰指针有三种情况:

  1. const修饰指针 — 常量指针
  2. const修饰常量 — 指针常量
  3. 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只读保护配置参数、只读硬件寄存器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值