转黄工的一篇文章,do while ,这个在Linux 里面也是经常见到,即使不是Linux ,只要涉及 C 语言的宏定义,就会出现,发出来给大家了解下。

写在前面

很多初学者,以及有一定工作经验的朋友都不知道这个“do{...} while(0U)”作用和意义,甚至觉得这样写的代码复杂且没意义。相信使用过STM32Cube HAL库的朋友都知道,源码里面有许多do{...} while(0U)的宏定义语句。今天讲的主要知识点是:HAL库中do{...} while(0U)作用和意义。当然,do{...} while(0U) 不限于HAL库中,适用于很多地方。

HAL库中do{} while(0U)宏定义

在HAL库中,很多.h文件都有do{...} while(0U)这样的宏定义,比如:在stm32f1xx_hal_rcc.h中,使能GPIO时钟:

对比在LL库中时钟使能代码,如下:

很多人只会觉得LL库这种函数比较合理,而想不明白为什么HAL会使用这种“do{...} while(0U)”宏定义的语句。下一章节重点讲述一下这种「 do{...} while(0U) 」宏定义的作用和意义。

do{...} while(0U)宏定义的作用和意义

使用do{...} while(0U)这种方式其实有几种重要作用,下面简单说几条:

1.编译出错

不使用do{}while:

使用大括号,多一个分号:

使用do{...} while(0U):

大家对比以上几种,你觉得哪一种合理?

2.避免goto跳转语句带来问题

不使用do{}hwile(0)

使用do{}hwile(0):

大家再对比以上两种,发现了什么问题?

我这里也不再继续举例说明了,大家可以上网了解,其实还有很多重要意义和作用。

怎么说呢,点到为止,希望对你有启发。

扫码或长按关注

回复「 加群 」进入技术群聊

宏定义_do{...} while(0U)宏定义的作用和意义相关推荐

  1. 定义一个有参宏判断一个字符是否在0~9之间

    <程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p241 习题7 12.定义一个有参宏IS_DIGIT(ch),当ch是一个0~9的字符时,返回1,否则 ...

  2. 定义一个有参宏SWAP(t,x,y),用以交换t类型的两个参数的值

    <程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p241 习题7 11.定义一个有参宏SWAP(t,x,y),用以交换t类型的两个参数的值 #inclu ...

  3. c/c++宏函数的定义与使用(宏定义函数)(macro definition)

    文章目录 为什么要使用宏函数? 什么是宏 如何使用宏 宏的定义 不带参数的宏 带参数的宏(假参数,不是真正的参数,只是替换而已) 原理 对了,如果宏函数与函数名称相同,优先使用宏定义函数 为什么要使用 ...

  4. c语言宏定义比较三个数大小,C语言中两个宏进行大小对比,其中一个没有定义,这种行为如何定义。...

    1.C语言中两个宏进行大小对比,其中一个没有定义,这种行为如何定义呢? 在学习U-boot的过程中遇到这么一个定义: # if (CONFIG_ENV_ADDR >= CONFIG_SYS_MO ...

  5. matlab 类似宏定义,比较全面的宏定义解析

    宏定义 宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义.文件包含.条件编译. 参数 不带参数 宏定义又称为宏代换.宏替换,简称"宏". 格式: #define ...

  6. 宏定义有无参数宏定义和带参数宏定义两种

    宏定义有无参数宏定义和带参数宏定义两种. 无参数的宏定义的一般形式为 # define 标识符 字符序列 其中# define之后的标识符称为宏定义名(简称宏名),要求宏名与字符序列之间用空格符分隔. ...

  7. 你真的了解宏吗:浅谈宏定义(#define语句)

    简单聊下宏呗 写在前面: 宏定义 语法 1. 宏的作用范围 2.宏替换的原则 4. 宏函数申明 5. 宏中的 "#" 和 "##" #的用法 ##的用法 6. ...

  8. c语言 宏定义 条件,c语言宏定义、条件编译

    笔记整理: 宏定义 宏定义的一般形式为: #define 宏名 字符串或者表达式 预处理的工作就是替换,就是将宏名替换成相应的字符串与表达式. 宏定义字符串: #define 宏名 字符串 该示例中的 ...

  9. C语言~宏操作大全(宏定义、内置宏、__FILE__、__LINE__、##用法)

    当然宏定义非常重要的,它可以帮助我们防止出错,提高代码的可移植性和可读性等.下面列举一些成熟软件中常用得宏定义1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDE ...

最新文章

  1. 加载页面就触发ajax,AJAX post方法,有时会在页面加载时触发,有时不会
  2. mac显示无法连接adobe服务器,Mac安装Adobe软件,如遇Error提示解决方法
  3. 爬虫实战学习笔记_2 网络请求urllib模块+设置请求头+Cookie+模拟登陆
  4. pxe安装linux dhcp失败,利用PXE自动化安装Centos时启动DHCP服务时遇到错误,请求大佬指教...
  5. 帆软报表 修改 加载中 文字
  6. java反射接口_Java反射详解
  7. 在EXCEL中进行趋势拟合与预测的方法
  8. verilog 产生m序列
  9. kdj买卖指标公式源码_通达信kdj买卖指标公式
  10. 但行好事 莫问前程(四月)
  11. 我的爬虫入门作(一)
  12. 7-10 黑洞数(20 分)
  13. windows10桌面鼠标右键出现卡顿解决方法
  14. 计算机工资高的岗位,毕业五年后工资最高的4大专业,就业容易岗位多
  15. 老旧车标致206能卖多少钱?且看团车网老旧车置换拍卖体验
  16. 求伯君—金山电脑公司总裁
  17. php 微信分享快速实现
  18. 04-Linux之Linux软件安装、三剑客和Shell编程
  19. 大学实验中如何进行光纤熔接、涂覆与测试?
  20. iOS常用快捷键总结

热门文章

  1. 聪明人自动焊锡机器人_自动焊锡机的基本焊锡原理
  2. Java的序列化特性将要退出历史舞台了
  3. 360好搜鬼畜视频一下两下成洗脑热词
  4. Android 使用代码设置selector 的图片或文字颜色
  5. DDD 领域驱动设计-三个问题思考实体和值对象(续)
  6. 使用Eclipse调试Android Native Application---cocos2d-x + Eclipse + Android + ndk
  7. ASP.NET Session的七点认识
  8. 发现了 四川方言版的让子弹飞 的种子
  9. 关于vue的语法规则检测报错问题
  10. Jsoup(一)Jsoup详解(官方)