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

嵌入式开发中为啥常用do{}while(0)进行宏定义

do{}while(0)宏定义方式广泛应用于Linux内核源码、FreeRTOS、uCOS-II、ARM内核、STM32......。

主要基于以下技术原因和优势:


场景1:语法歧义或错误、逻辑错误问题

#define EXTIE1()     {EXTI_FTSR &= 0xFF00; EXTI_BTSR &= 0xFF0F;}
#define EXTIE2()     {EXTI_FTSR &= 0xFF00; EXTI_BTSR &= 0xFF0F}
#define EXTIE3()      EXTI_FTSR &= 0xFF00; EXTI_BTSR &= 0xFF0Fif (condition)EXTIE1(x); // 这里多个分号
if elseEXTIE2(); // 这里有分号
if elseEXTIE3(); // 这里有分号
elseSomething(); // 这里有分号

展开

if (condition){EXTI_FTSR &= 0xFF00; EXTI_BTSR &= 0xFF0F;}; // 这里有两个分号!语法歧义或错误
if else{EXTI_FTSR &= 0xFF00; EXTI_BTSR &= 0xFF0F}; // 这里有个分号!语法歧义或错误
if elseEXTI_FTSR &= 0xFF00; EXTI_BTSR &= 0xFF0F; // 逻辑错误
elseSomething(); // 这里有分号


场景2:编码风格不一致导致的维护问题

#define EXTIE1()     {EXTI_FTSR &= 0xFF00; EXTI_BTSR &= 0xFF0F;}
#define EXTIE2()      EXTI_FTSR &= 0xFF00;
#define EXTIE3()      EXTI_BTSR &= 0xFF0F
if (condition)EXTIE1(x) // 这里无分号!与函数语法不一致
if elseEXTIE2() // 这里有个分号!
if elseEXTIE3(); // 这里有个分号!若这个宏是其他合作者定义的,与团队语法不一致
elseSomething(); // 这里有分号

展开

if (condition){EXTI_FTSR &= 0xFF00; EXTI_BTSR &= 0xFF0F;} // 这里无分号!
if elseEXTI_FTSR &= 0xFF00; // 这里有个分号!
if elseEXTI_BTSR &= 0xFF0F; // 这里有个分号!
elseSomething(); // 这里有分号

场景3:支持局部变量定义‌

#define SWAP(a, b) {tmp = a, a = b, b = tmp;} // 有语法错误,除非tmp在外面定义变量
#define SWAP(a, b) do{int tmp = a, a = b, b = tmp;}while(0) // 正确,不用单独在外部定义临时变量

场景4:避免空宏的编译警告‌

#define MACRO_DEF1()   // 空宏定义可能引发编译器警告
#define MACRO_DEF2() do{}while(0) // 空宏定义能通过编译,无警告

场景5: 行为一致,不产生额外代码

优化友好:现代编译器会优化掉 while(0),不会产生任何额外代码
作用域清晰:在宏内部定义的变量不会泄露到外部
行业标准:被广泛认可的最佳实践,无论在哪里使用,行为都是一致的

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

相关文章:

  • 第六部分:VTK进阶(第172章 vtk-m加速器管线)
  • 矽塔 SA8207 36V输入耐压 高精度可调过流保护与集成智能故障管理 过压过流保护芯片
  • 关键词优化公司网站怎么做网站后台界面
  • 从「Bug 制造机」到「问题解决者」的进化之路
  • 华为新一代鸿蒙操作系统实现与苹果互联
  • 常用 apt 命令及语法(Ubuntu)
  • 华为 AI,建造中的全景图
  • 第二十九篇:动态规划(一):基础与背包问题
  • 深度学习中的训练流程:从输入到权重更新的完整旅程
  • QT------QPainter::save() 和 QPainter::restore() 的使用方法和作用。
  • http trailer 与 http2
  • 有没有会计做兼职的网站wordpress获取文章
  • 中国人在国外做网站网站代理网站群建设 会议 主持
  • 在Ubuntu Linux安装brew 使用brew安装llama.cpp 运行文心Ernie大模型
  • 基于MATLAB/Simulink的风光储联合系统经M3C接入电网的低电压穿越仿真研究
  • CNCF Kepler与MCP:开启云原生绿色计算的人机协作新纪元
  • 昇腾NPU部署GPT-OSS-20B混合专家模型:从环境配置到性能优化的完整实践指南
  • java8中的‘+‘的使用注意事项
  • 德国莱茵金属公司使用Varjo XR-4创建虚拟现实培训解决方案
  • STM32的GPIOx_ODR,GPIOx_BSRR,GPIOx_BRR寄存器的区别与使用
  • 网站建设指南 菜鸟教程简历模板做的最好的是哪个网站
  • Prometheus + Alertmanager + 钉钉告警
  • 基于 Spring Boot + RabbitMQ 实现应用通信
  • docker一键部署prometheus和grafana
  • 《深入剖析TCP Socket API:从连接到断开的全链路解读》
  • 数据库连接池 HikariCP Spring官方内置连接池 配置简单 以性能与稳定性闻名天下
  • Flink Watermark(水位线)机制详解
  • wordpress wpadmin东莞seo网站建设公司
  • 刷赞网站怎么做WordPress编辑器加载慢
  • 【知识图谱】图神经网络(GNN)核心概念详解:从消息传递到实战应用