嵌入式软件学习记录 - DAY2

news2025/5/18 1:12:39

一、volatile 修饰符

1. 能修饰什么?

  • 变量(包括普通变量、指针、结构体成员等)。
  • 不能修饰函数(但函数参数或返回值可以是 volatile 类型)。

2. 作用

  • 告诉编译器不要优化该变量的访问:每次读取或写入该变量时,都会直接从内存操作,而非使用寄存器中的缓存值。
  • 适用于可能被意外修改的场景(如硬件寄存器、多线程共享变量、中断服务程序中的变量)。

3. 示例

// 硬件寄存器(如定时器、状态标志)
volatile int *status_register = (volatile int *)0x40000000;

// 多线程共享变量(C++ 中更推荐使用 atomic)
volatile bool thread_running = true;

// 中断服务程序中的标志位
void ISR() {
    thread_running = false;  // 直接更新内存,避免编译器优化
}

二、static 修饰符

1. 能修饰什么?

  • 全局变量和函数(限制作用域为当前文件)。
  • 局部变量(延长生命周期至程序结束)。
  • 类成员(C++ 中,属于类而非对象,所有对象共享)。

2. 作用

  • 全局变量 / 函数
    • 将作用域限制在当前文件(外部文件不可见),避免命名冲突。
    • 示例
      static int file_private_var = 10;  // 仅当前文件可见
      static void helper() { ... }       // 仅当前文件可调用
      
  • 局部变量
    • 初始化一次,生命周期延长至整个程序运行时,保留上次调用的值。
    • 示例
      void func() {
          static int counter = 0;  // 仅首次调用时初始化
          counter++;  // 每次调用保留上次的值
      }
      
  • 类成员(C++)
    • 静态成员变量:所有对象共享同一个实例,需在类外初始化。
    • 静态成员函数:不依赖对象,可直接通过类名调用,无 this 指针。
    • 示例
      class Logger {
      public:
          static void log(const char* msg) { ... }  // 静态函数
      private:
          static int instance_count;  // 静态变量
      };
      int Logger::instance_count = 0;  // 类外初始化
      

三、const 修饰符

1. 能修饰什么?

  • 变量(声明常量,不可修改)。
  • 指针(常量指针或指向常量的指针)。
  • 函数参数 / 返回值(限制参数或返回值不可修改)。
  • 类成员函数(C++ 中,保证不修改对象状态)。

2. 作用

  • 变量
    • 定义常量,必须初始化,之后不可修改。
    • 示例
      const int MAX_SIZE = 100;  // 常量
      MAX_SIZE = 200;  // 错误:修改常量
      
  • 指针
    • 指向常量的指针:不能通过指针修改指向的内容,但指针本身可修改。
      const int* p = &x;  // *p 不可修改,p 可修改
      
    • 常量指针:指针本身不可修改,但指向的内容可修改。
      int* const p = &x;  // p 不可修改,*p 可修改
      
    • 指向常量的常量指针:两者都不可修改。
      const int* const p = &x;
      
  • 函数参数
    • 防止函数内部修改传入的参数。
    • 示例
      void print(const char* msg) {
          // msg[0] = 'X';  // 错误:尝试修改 const 参数
      }
      
  • 类成员函数(C++)
    • 声明为 const 的成员函数不能修改对象的非静态成员。
    • 示例
      class Point {
      public:
          int getX() const { return x; }  // const 函数
          void setX(int val) { x = val; }  // 非 const 函数
      private:
          int x;
      };
      

四、extern 修饰符

1. 能修饰什么?

  • 全局变量(声明但不定义)。
  • 函数(声明但不定义)。
  • C++ 中指定 C 链接extern "C")。

2. 作用

  • 声明外部变量 / 函数
    • 告诉编译器该变量 / 函数在其他文件中定义,无需在此分配内存。
    • 示例
      // file1.c
      int shared_var = 10;  // 定义变量
      
      // file2.c
      extern int shared_var;  // 声明外部变量
      printf("%d", shared_var);  // 使用其他文件的变量
      
  • C++ 中兼容 C 代码
    • 使用 extern "C" 告诉 C++ 编译器按 C 语言的命名规则(不进行名称修饰)处理函数名。
    • 示例
      // C++ 代码中调用 C 库函数
      extern "C" {
          #include <stdio.h>  // C 标准库
          void c_function(int);  // C 函数声明
      }
      

五、对比总结

关键字作用域 / 生命周期可修饰对象核心用途
volatile不影响作用域,禁止编译器优化变量、指针处理硬件交互、多线程共享变量等可能意外修改的场景
static限制全局作用域,或延长局部生命周期全局变量、函数、局部变量、类成员隐藏文件内部符号,或实现局部变量持久化、类级别共享成员
const不影响作用域,限制修改变量、指针、函数参数 / 返回值、类成员函数定义常量,保证数据不被意外修改,增强类型安全性
extern声明外部符号全局变量、函数跨文件共享变量 / 函数,或在 C++ 中兼容 C 语言的链接规则

六、注意事项

  1. const 和 volatile 可组合使用
    const volatile int* reg = (const volatile int*)0x40000000;  // 只读硬件寄存器
    
  2. static 和 extern 互斥
    • static 表示 “内部链接”(仅当前文件可见),而 extern 表示 “外部链接”,两者不能同时修饰同一全局变量。
  3. C++ 中 static 类成员必须在类外初始化
    class A {
        static int count;  // 声明
    };
    int A::count = 0;  // 定义并初始化
    

     

理解这些修饰符的作用,有助于编写更安全、高效、可维护的代码。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2378117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图片、音频、视频都能转?简鹿格式工厂了解一下

我们每天都会接触到各种各样的音视频和图片文件。无论是拍摄的照片、录制的视频&#xff0c;还是下载的音频资源&#xff0c;它们往往以不同的格式存在——有些适合分享&#xff0c;有些适合编辑&#xff0c;而有些则仅限特定设备或平台使用。格式不统一的问题&#xff0c;正在…

Qt—用SQLite实现简单的注册登录界面

1.实现目标 本次实现通过SQLite制作一个简易的登录窗口&#xff0c;当点击注册按钮时&#xff0c;登录窗口会消失&#xff0c;会出现一个新的注册界面&#xff1b;完成注册或退出注册时&#xff0c;注册窗口会消失&#xff0c;重新出现登录窗口。注册过的用户信息会出现在SQLi…

MySQL命令行导出数据(docker版本)

MySQL命令行导出数据(docker版本) 1、登录数据库 $mysql -h 10.1.1.143 -u root -p 2、用命令行从MySQL导出数据(无标题) #查看导出时可以存储的路径 mysql> SHOW VARIABLES LIKE secure_file_priv; ----------------------------------------- | Variable_name | Valu…

Python 3.13.3 安装教程

原文来自&#xff1a;Python 3.13.3 安装教程 | w3cschool笔记 &#xff08;请勿标记为付费&#xff01;&#xff01;&#xff01;&#xff09; Python 是一种广泛使用的编程语言&#xff0c;广泛应用于 Web 开发、科学计算、数据处理、人工智能等领域。Python 3.13.3 作为 P…

现代化水库运行管理矩阵平台如何建设?

政策背景 2023年8月24日&#xff0c;水利部发布的水利部关于加快构建现代化水库运行管理矩阵的指导意见中指出&#xff0c;在全面推进水库工程标准化管理的基础上&#xff0c;强化数字赋能&#xff0c;加快构建以推进全覆盖、全要素、全天候、全周期“四全”管理&#xff0c;完…

2025程序设计天梯赛补题报告

2025程序设计天梯赛补题报告 仅包含L1 L2 L1-6 这不是字符串题 题目描述 因为每年天梯赛字符串题的解答率都不尽如人意&#xff0c;因此出题组从几年前开始决定&#xff1a;每年的天梯赛的 15 分一定会有一道字符串题&#xff0c;另外一道则一定不是字符串题。 小特现在有…

SpringBoot3.4.5下Lombok的@Data注解不生效,解决方案

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java、嵌入式、鸿蒙、人工智能等,专注于程序员成长那点儿事,希望在成长的路上有你相伴&#xff01;君志所向,一往无前&#xff01; 1.问题 最近的项目是Python、Java、鸿蒙的来回交叉&#xff0c;再做的一个Java的项目…

如何在 Windows 上安装类似 Synaptic 的 Chocolatey GUI 包管理器

如果你正在寻找类似 Linux 中 APT 的 Windows 包管理器&#xff0c;那么没有什么比 Chocolatey 更好的了。它是 Windows 10 上可用的最佳包管理器之一&#xff0c;可以通过命令行界面安装所有流行的软件和工具。然而&#xff0c;这并不意味着如果你不喜欢命令行&#xff0c;你就…

Guided Filtering相关记录

一、背景介绍 以前折腾保边滤波时候&#xff0c;刷了一些Guided Filtering相关资料。这里主要是对它们做个算法效果复现和资料简单整理。 二、Guided Filtering 1、基本原理 原版Guided Filtering的提出&#xff0c;主要是为了改善双边滤波做保边平滑滤波器时候的梯度翻转伪影…

智能AI构建工地安全网:跌倒、抽搐、区域入侵多场景覆盖

智能AI在工地安全中的应用&#xff1a;从监测到救援的全流程实践 一、背景&#xff1a;高温作业下的工地安全挑战 随着夏季高温持续&#xff0c;工地户外作业环境面临严峻考验。工人因高温疲劳、脱水或突发疾病引发的行为异常&#xff08;如晕厥、抽搐、跌倒&#xff09;频发…

Spring+LangChain4j小智医疗项目

这里写目录标题 LangChain4j入门配置测试Ollama阿里云百炼平台AIService聊天记忆隔离聊天 MongoDB持久化存储Prompt*创建小智医疗助手Function Calling&#xff08;Tools&#xff09;实战小智医疗智能体 RAGToken分词器向量存储流式输出总结 LangChain4j入门 LangChain4j 是一…

解决“VMware另一个程序已锁定文件的一部分,进程无法访问“

问题描述 打开VMware里的虚拟机时&#xff0c;弹出"另一个程序已锁定文件的一部分&#xff0c;进程无法访问"如图所示&#xff1a; 这是VM虚拟机的保护机制。虚拟机运行时&#xff0c;为防止数据被篡改&#xff0c;会将所运行的文件保护起来。当虚拟机崩溃或者强制…

buuctf Crypto-鸡藕椒盐味1

1.题目&#xff1a; 公司食堂最新出了一种小吃&#xff0c;叫鸡藕椒盐味汉堡&#xff0c;售价八块钱&#xff0c;为了促销&#xff0c;上面有一个验证码&#xff0c;输入后可以再换取一个汉堡。但是问题是每个验证码几乎都有错误,而且打印的时候倒了一下。小明买到了一个汉堡&a…

FreeRTOS的学习记录(基础知识)

FreeRTOS 简介 FreeRTOS 是一个开源的实时操作系统&#xff08;RTOS&#xff09;&#xff0c;专为嵌入式系统设计。它提供了任务管理、时间管理、信号量、消息队列、内存管理等功能&#xff0c;适用于资源受限的微控制器。 FreeRTOS 是一个开源的实时操作系统内核&#xff0c…

会议分享|高超声速流动测量技术研讨会精彩探析

由中国空气动力学会测控专业委员会主办&#xff0c;中国科学技术大学工程科学学院承办的第八届三次委员会暨高超声速流动测量技术研讨会&#xff0c;5月16日在合肥盛大开幕。 会议专家报告分享了高超声速流动测量的最新研究成果、挑战与突破&#xff0c;展示了PIV高速摄像机、粒…

1-10 目录树

在ZIP归档文件中&#xff0c;保留着所有压缩文件和目录的相对路径和名称。当使用WinZIP等GUI软件打开ZIP归档文件时&#xff0c;可以从这些信息中重建目录的树状结构。请编写程序实现目录的树状结构的重建工作。 输入格式: 输入首先给出正整数N&#xff08;≤104&#xff09;…

Unix/Linux | A Programming Guide

注&#xff1a;本文为 “UNIX / Linux 教程” 相关文章合辑。 略作重排&#xff0c;如有内容异常&#xff0c;请看原文。 UNIX / Linux Tutorial for Beginners: Learn Online in 7 days By : Emily Carter UpdatedFebruary 5, 2025 UNIX / Linux Tutorial Summary Linux …

前端——布局方式

普通流&#xff08;标准流&#xff09; 所谓的标准流: 就是标签按照规定好默认方式排列. 1. 块级元素会独占一行&#xff0c;从上向下顺序排列。 常用元素&#xff1a;div、hr、p、h1~h6、ul、ol、dl、form、table 2. 行内元素会按照顺序&#xff0c;从左到右顺序排列&am…

Multimodal models —— CLIP,LLava,QWen

目录 CLIP CLIP训练 CLIP图像分类 CLIP框架 Text Enocder Image Encoder LLava系列 LLava LLava贡献 LLava模型结构 总结 LLava两阶段训练 LLava 1.5 LLava 1.6 QWen CLIP CLIP是OpenAI 在 2021 年发布的&#xff0c;最初用于匹配图像和文本的预训练神经网络模型…

LabVIEW与PLC通讯程序S7.Net.dll

下图中展示的是 LabVIEW 环境下通过调用S7.Net.dll 组件与西门子 PLC 进行通讯的程序。LabVIEW 作为一种图形化编程语言&#xff0c;结合S7.Net.dll 的.NET 组件优势&#xff0c;在工业自动化领域中可高效实现与 PLC 的数据交互&#xff0c;快速构建工业监控与控制应用。相较于…