当前位置: 首页 > news >正文

C语言 - 变量修饰关键字

在嵌入式 C 语言中,修饰变量的关键字主要用于控制变量的存储方式、作用域、生命周期以及访问方式。以下是常见的关键字及其作用:

嵌入式 C 语言变量修饰关键字

1. volatile(易变变量)

作用

  • 告诉编译器该变量可能被外部因素(如硬件寄存器、中断等)修改,不要优化相关代码。
  • 防止编译器进行 寄存器缓存优化,确保每次访问变量时都 直接读取内存

使用场景

  • 访问 硬件寄存器
    volatile int *UART_STATUS = (int *)0x4000;  // 硬件寄存器
    
  • 中断 处理的共享变量:
    volatile int flag = 0; // 防止编译器优化
    

2. const(常量变量)

作用

  • 声明一个 不可修改 的变量(编译时保护)。
  • 用于 存储 ROM/Flash 中的数据,减少 RAM 占用。

使用场景

  • 定义 只读变量
    const int max_value = 100;
    
  • 定义 常量字符串
    const char *message = "Hello, World!";
    

3. static(静态变量)

作用

  • 局部变量:保留 上一次值,生命周期为整个程序运行期间。
  • 全局变量:限制变量作用域,使其 仅在当前文件可见(类似 private)。

使用场景

  • 函数内局部变量(不会在函数调用结束后销毁):
    void count_calls() {
        static int count = 0;
        count++;
        printf("Called %d times\n", count);
    }
    
  • 限制全局变量作用域
    static int global_var = 10;  // 只能在当前文件使用
    

4. register(寄存器变量,已过时)

作用

  • 建议 编译器将变量存放在 CPU 寄存器 以加快访问速度(但现代编译器通常会自动优化,不常用)。
  • 不能获取地址(不能使用 & 取地址)。

使用场景

register int i = 0; // 建议优化,但编译器可能忽略

5. extern(外部变量)

作用

  • 用于声明 其他文件中定义的全局变量
  • 解决 多文件共享变量 的问题。

使用场景

  • 头文件 file1.h
    extern int shared_var;
    
  • 源文件 file1.c
    int shared_var = 100;
    
  • 使用 file2.c
    #include "file1.h"
    printf("%d", shared_var);  // 输出 100
    

6. restrict(指针优化)

作用

  • 告诉编译器 该指针是唯一访问该数据的方式,可优化代码执行速度(仅适用于 C99 及以上)。
  • 提高编译器优化能力,减少内存访问。

使用场景

void process_data(int *restrict ptr1, int *restrict ptr2);

注意:如果 ptr1ptr2 指向同一块内存,行为未定义。

7. _Atomic(原子变量,C11 引入)

作用

  • 解决 多线程多核 CPU 访问共享变量时的数据竞争问题。

使用场景

#include <stdatomic.h>
_Atomic int counter = 0;  // 线程安全变量

总结

关键字作用
volatile防止编译器优化,确保每次都从内存读取(用于硬件寄存器、中断变量)。
const定义只读变量(存储在 ROM/Flash)。
static局部变量:保留值不丢失;全局变量:限制作用域(仅在当前文件可见)。
register建议使用寄存器存储变量(现代编译器很少使用)。
extern声明外部变量,解决多文件共享变量问题。
restrict限制指针别名,提高编译器优化能力(C99 以上)。
_Atomic解决多线程或多核数据竞争问题(C11 以上)。

这些关键字在嵌入式系统中至关重要,合理使用可以提高代码的 可读性、效率和可靠性

(完)

http://www.dtcms.com/a/99353.html

相关文章:

  • 软件测试之接口测试
  • 【Git “reflog“ 命令详解】
  • Vue2 项目将网页内容转换为图片并保存到本地
  • 基于74LS192的十进制两位数正向计时器(proteus仿真)
  • pycharm找不到conda可执行文件解决办法
  • 【数据结构】并查集
  • 数据湖的崛起:从大数据到智能未来的钥匙
  • 嵌入式开发技术总结报告
  • 从呼叫中心到大模型赋能:客户服务的智能化跃迁与人机协同新范式
  • 第二章 机器学习概述(续)
  • Linux上位机开发实践(MPP平台的核心构成)
  • 【Linux网络与网络编程】02.初识Socket编程
  • ACL 访问控制列表配置命令2
  • 每日算法-250329
  • 注意力蒸馏技术
  • 深度学习处理时间序列(7)
  • Github 2025-03-28 Java开源项目日报Top10
  • 手机硬件检测详解:从版本信息到相机功能的全面指南
  • [Java微服务架构]7-1_事务处理——事务特性与本地事务
  • 【商城实战(101)】电商未来已来:新技术引领商城发展新航向
  • 查看显卡算力
  • 使用LangChain Agents构建Gradio及Gradio Tools(1)——LangChain Agent概念
  • RCE--解法
  • 基于SpringBoot的“医疗设备管理系统”的设计与实现(源码+数据库+文档+PPT)
  • MySQL源码学习系列(一)-- 环境准备及常用命令
  • 【LeetCode】—169.多数元素
  • Java基础-21-基本语法-封装
  • 聚合根的特性
  • CI/CD-Jenkins安装与应用
  • 【网络编程】搭建一个简单的UDP通信服务器和客户端