侵权投诉

do{...} while(0U) 这种代码的作用和意义

strongerHuang 2021-06-04 14:00 次阅读

在一些项目中,我们可能看到过很多,在学习的时候没有见过的代码,比如 do{...} while(0U) 这种代码,在我们学习的时候可能很少见,但实际项目中却存在很多类似代码。

今天就来讲讲关于 do{...} while(0U) 的内容。

1

前言

很多初学者都不知道这个“do{...} while(0U)”作用和意义,甚至觉得这样写的代码复杂且没意义。

相信使用过STM32Cube HAL库的朋友都知道,源码里面有许多do{...} while(0U)的宏定义语句。 今天讲的主要知识点是:HAL库中do{...} while(0U)作用和意义。 当然,do{...} while(0U)不限于HAL库中,适用于很多地方。

2

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

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

65bcab4a-c4b8-11eb-9e57-12bb97331649.jpg

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

65c9c73a-c4b8-11eb-9e57-12bb97331649.jpg

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

3

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

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

1.编译出错

不使用do{}while:

65d46a14-c4b8-11eb-9e57-12bb97331649.png

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

65ebcb14-c4b8-11eb-9e57-12bb97331649.jpg

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

65fc6e6a-c4b8-11eb-9e57-12bb97331649.jpg

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

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

不使用do{}hwile(0):

6606c112-c4b8-11eb-9e57-12bb97331649.jpg

使用do{}hwile(0):

6622dcbc-c4b8-11eb-9e57-12bb97331649.png

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

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

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

编辑:jq

原文标题:项目中大量使用do{...} while(0U)的作用和意义

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

openharmony代码获取分析

本文档将介绍如何获取OpenHarmony源码并说明OpenHarmony的源码目录结构。OpenH....
的头像 电子魔法师 发表于 06-23 16:30 23次 阅读
openharmony代码获取分析

如何去实现并验证一种归并排序?

归并排序的核心思想是:利用分治策略,不断划分子序列直到不能划分为止,此时各个子序列是有序的,合并相邻....
的头像 Android编程精选 发表于 06-23 14:29 18次 阅读
如何去实现并验证一种归并排序?

openharmony什么语言编写的

OpenHarmony是开放原子开源基金会(OpenAtom Foundation)旗下开源项目,定....
的头像 Les 发表于 06-23 11:33 8次 阅读
openharmony什么语言编写的

如何将代码迁出X86服务器

如今,我们几乎所有软件都建立在x86架构之上,在互联网漫长的演进过程中,各大公司拼尽全力在迭代上层架....
发表于 06-23 09:55 1次 阅读
如何将代码迁出X86服务器

openharmony代码注释 加注释方式是怎样的

OpenHarmony 2.0 自主研发,不兼容安卓。众多开发合作伙伴将以开源社区为中心,分阶段快速....
的头像 独爱72H 发表于 06-23 09:42 75次 阅读
openharmony代码注释 加注释方式是怎样的

如何使用union来了解内存?

今天一个读者朋友给我发的一段代码,这段代码让他有了疑惑。 代码如下: #include “stdio....
的头像 Linux爱好者 发表于 06-22 17:01 47次 阅读
如何使用union来了解内存?

雨雾天气下公路的可变限速控制策略

雨雾天气下公路的可变限速控制策略
发表于 06-22 14:55 4次 阅读
雨雾天气下公路的可变限速控制策略

可程控遥感数据动态采集下的临空高速目标探测系统

可程控遥感数据动态采集下的临空高速目标探测系统
发表于 06-22 14:25 36次 阅读
可程控遥感数据动态采集下的临空高速目标探测系统

openharmony开原方法以及教程

OpenHarmony已经开放有一段时间了,下面为大家讲一下它的技术架构以及代码获取方式。 技术架构....
的头像 Les 发表于 06-22 11:05 67次 阅读
openharmony开原方法以及教程

深度解读什么是DevOp以及DevOps的技术实现

近两年,随着容器、Kubernetes 等技术的兴起,DevOps 这个概念被广泛提及并被大量使用。....
的头像 马哥Linux运维 发表于 06-21 17:46 77次 阅读
深度解读什么是DevOp以及DevOps的技术实现

你知道如何去求解连续区间吗?

求解连续区间是数据分析、数据仓库笔试面试中常考的SQL题目。
的头像 数据分析与开发 发表于 06-21 17:42 80次 阅读
你知道如何去求解连续区间吗?

基于结构约束的全局目标函数视频修复

针对一致性修复方法仅利用视频的颜色和运动特征来优化目标函数,导致无法准确预测未知区域像素值的冋题,将....
发表于 06-21 16:39 9次 阅读
基于结构约束的全局目标函数视频修复

嵌入式C编码需要遵循的规范有哪些?

编写代码时最重要的一条规则是:检查周围的代码并尝试模仿它。
的头像 电子森林 发表于 06-21 15:07 55次 阅读
嵌入式C编码需要遵循的规范有哪些?

STM32开发中使用C语言实现IIC驱动

简述 IIC(Inter-Integrated Circuit)其实是IICBus简称,它是一种串行....
的头像 STM32嵌入式开发 发表于 06-21 14:58 69次 阅读
STM32开发中使用C语言实现IIC驱动

浅谈Verilog-95、Verilog-2001与System Verilog之间的区别

发展历史 1984年,Verilog开始作为一种专用的硬件建模语言使用,取得了相当大的成功。1990....
的头像 OpenFPGA 发表于 06-21 14:46 112次 阅读
浅谈Verilog-95、Verilog-2001与System Verilog之间的区别

可应用在电磁涡流场问题的等几何配点法

可应用在电磁涡流场问题的等几何配点法
发表于 06-21 14:39 5次 阅读
可应用在电磁涡流场问题的等几何配点法

机器学习必学的Python代码示例集

机器学习必学的Python代码示例集
发表于 06-21 09:35 16次 阅读
机器学习必学的Python代码示例集

全新GAN迁移方法实现了「一对多」的生成效果

从技术上来讲,研究者基于对内容与风格的简单和有效定义中得出了对抗性损失,它保证了映射的多样性,即可以....
的头像 机器人大讲堂 发表于 06-21 09:11 232次 阅读
全新GAN迁移方法实现了「一对多」的生成效果

C语言的重要性及其特点是什么?

C语言为什么如此重要 ? C语言有哪些特点呢? ...
发表于 06-21 06:36 0次 阅读
C语言的重要性及其特点是什么?

教大家怎么选择神经网络的超参数

1. 神经网络的超参数分类 神经网路中的超参数主要包括: 学习率 η, 正则化参数 λ, 神经网络的....
的头像 Imagination Tech 发表于 06-19 14:49 89次 阅读
教大家怎么选择神经网络的超参数

基于交叉熵损失函欻的深度自编码器诊断模型

在实际应用中,滚动轴承大多时候都是在正常状态下工作,因此收集到的故障数据较少,这就会产生数据不均衡的....
发表于 06-18 16:49 23次 阅读
基于交叉熵损失函欻的深度自编码器诊断模型

基于有序统计滤波能量驱动的图像快速分割

为了提升图像分割的速度与初始轮廓和参数鲁棒性,提岀了一种基于有序统计滤波能量驱动的魯棒辶动轮廓模型首....
发表于 06-18 15:51 9次 阅读
基于有序统计滤波能量驱动的图像快速分割

简述西门子SCL中的SEL函数的使用

SEL函数选择两个输入值之一。 除ARRAY和ATRUCT数据类型和参数数据类型外的所有类型均作为输....
的头像 机器人及PLC自动化应用 发表于 06-18 15:24 88次 阅读
简述西门子SCL中的SEL函数的使用

glibc内存管理存在的共性问题及解决方法

引言 对于嵌入式设备来说,用户态内存管理是一项基础功能,目前主流的用户态内存管理库有glibc、uc....
的头像 Linux阅码场 发表于 06-18 14:50 82次 阅读
glibc内存管理存在的共性问题及解决方法

如何升级鸿蒙系统 鸿蒙系统下载官网如何下载源码

华为公司在六月二发布开源了自产的操作系统--鸿蒙操作系统。有很多华为忠实粉丝拥有了华为手机,但是不知....
的头像 Les 发表于 06-18 11:11 429次 阅读
如何升级鸿蒙系统 鸿蒙系统下载官网如何下载源码

深度解析数据结构与算法篇之队列及环形队列的实现

01 — 队列简介 队列是种先进先出的数据结构,有个元素进入队列称为入对(enqueue),删除元素....
的头像 Android编程精选 发表于 06-18 10:07 67次 阅读
深度解析数据结构与算法篇之队列及环形队列的实现

揭秘冒泡排序、交换排序和插入排序

01 — 冒泡排序 在实现冒泡排序代码之前我们先理解一下什么是冒泡排序,我们举一个现实生活中的例子来....
的头像 Android编程精选 发表于 06-18 09:57 79次 阅读
揭秘冒泡排序、交换排序和插入排序

请问如何在开始码代码的时候就考虑时序收敛的问题?

如何在开始码代码的时候就考虑时序收敛的问题?...
发表于 06-18 06:29 0次 阅读
请问如何在开始码代码的时候就考虑时序收敛的问题?

关于C语言编程的四部经典之作

很多朋友问我学了很久的C语言,可是看一些稍微大一点的代码还是有一些懵圈,自己写一些程序也是漏洞百出,....
的头像 嵌入式ARM 发表于 06-17 17:13 159次 阅读
关于C语言编程的四部经典之作

教你如何轻松写单片机的指针

摘要:大家想过没有我们用keil写单片机的代码,你的函数啊、变量啊最终都放在了哪里?我们一直说的内存....
的头像 凡亿PCB 发表于 06-17 16:08 117次 阅读
教你如何轻松写单片机的指针

使用Flutter和 Firebase轻松构建Web应用

我们 (Very Good Ventures 团队) 与 Google 合作,在今年的 Google....
的头像 谷歌开发者 发表于 06-17 14:29 141次 阅读
使用Flutter和 Firebase轻松构建Web应用

双向循环链表函数是什么?如何去实现它?

双向循环链表结点内部有2个指针prev和next分别指向前后的结点,结点定义代码如下。
的头像 Android编程精选 发表于 06-17 12:50 125次 阅读
双向循环链表函数是什么?如何去实现它?

什么是软件定义无线电(SDR)?

什么是软件定义无线电(SDR)?软件定义无线电(SDR)的发展过程如何? ...
发表于 06-17 11:36 0次 阅读
什么是软件定义无线电(SDR)?

基于布尔函数导数的布尔置换构造

布尔函数导数的性质在密码构造中起着重要的作用。文中利用布尔函数导数的性质,构造了一个新的平衡布尔函数....
发表于 06-17 10:58 7次 阅读
基于布尔函数导数的布尔置换构造

什么是延迟方程?它有什么应用?

我们写下在t时刻感受到的水的温度T(t)。假设水要花d秒的时间才能流过管道。
的头像 中科院半导体所 发表于 06-17 10:08 119次 阅读
什么是延迟方程?它有什么应用?

建议收藏的20款实用的数据可视化工具

如今学习应用数据可视化的渠道有很多,你可以跟踪一些专家博客,但更重要的一点是实践/实操,你必须对目前....
的头像 人工智能与大数据技术 发表于 06-17 09:47 90次 阅读
建议收藏的20款实用的数据可视化工具

关于神经网络的十大学习率衰减提效策略

十大学习率衰减策略! 简 介 目前越来越多非结构化问题的出现,神经网络也扮演着愈加重要的作用。一个好....
的头像 深度学习自然语言处理 发表于 06-16 17:48 212次 阅读
关于神经网络的十大学习率衰减提效策略

知道STM32串口通信乱码要怎么处理吗

STM32串口通信以及温度采集搞定,其中主要遇到STM32系列单片机时钟树的问题,串口通信遇到串口调....
的头像 MCU开发加油站 发表于 06-16 15:35 155次 阅读
知道STM32串口通信乱码要怎么处理吗

基于罗盘算子的改进蝙蝠优化算法综述

优化问题广泛存在于工程技术、经济管理等各个领域。实际问题的复杂性,导致传统的优化方法难以解决这些问题....
发表于 06-16 14:52 8次 阅读
基于罗盘算子的改进蝙蝠优化算法综述

基于函数逼近协同更新的DQN算法

针对经典深度Q网络(DepΩ Network,DQN)算法在训练初期收敛速度慢的问题,文中提岀一种新....
发表于 06-16 14:50 6次 阅读
基于函数逼近协同更新的DQN算法

基于无约束优化的无参数填充函数算法

填充函数法是求解无约束全局优化问题的重要方法,其核心工作在于构建具有良妤性质、形式简单而且容易求解极....
发表于 06-16 11:11 9次 阅读
基于无约束优化的无参数填充函数算法

有谁来解释一下以太坊升级为什么会延期?

有谁来解释一下以太坊升级为什么会延期? 是什么原因导致了以太坊升级延期? ...
发表于 06-16 09:43 0次 阅读
有谁来解释一下以太坊升级为什么会延期?

复变函数资料汇总下载

复变函数资料汇总下载
发表于 06-15 10:13 18次 阅读
复变函数资料汇总下载

浅谈RTL设计风格及Verilog编码规范

一、同步设计 1.1 时钟的同步设计 关注问题: (1)设计中尽可能使用单时钟和单时钟边沿触发 (2....
的头像 FPGA之家 发表于 06-12 17:20 92次 阅读
浅谈RTL设计风格及Verilog编码规范

一个函数究竟能不能超过50行呢?

有些读者可能看到过类似这样的描述,而自己做项目时,很多函数都比较多(超过50行),就会怀疑自己这样写....
的头像 strongerHuang 发表于 06-11 12:46 180次 阅读
一个函数究竟能不能超过50行呢?

ios15正式版发布时间 什么时候发布

6月8号凌晨,苹果举行了一年一度的WWDC21开发者大会,发布了全新的iOS15、iPadOS 15....
的头像 牵手一起梦 发表于 06-11 09:25 5398次 阅读
ios15正式版发布时间 什么时候发布

matlab升级2021a版本后有哪些函数需要替换?

之前有文章提到了randi函数替换randint函数,但还有很多函数也已经不用了。我之前曾经用过rc....
的头像 通信工程师专辑 发表于 06-10 16:44 195次 阅读
matlab升级2021a版本后有哪些函数需要替换?

一步一步教你如何去发布Python项目开源包?

注意:本文假设你在 GitHub 上已经有一个想要打包和发布的项目。
的头像 马哥Linux运维 发表于 06-10 14:22 102次 阅读
一步一步教你如何去发布Python项目开源包?

DSP 一个IO管脚引发的问题

芯片是tms320F28377D,我想打开一些IO管脚给他输出置高电平,程序的话没问题,因为想打开的IO口都打开了,唯独一个62管脚只...
发表于 06-10 10:33 101次 阅读
DSP 一个IO管脚引发的问题

全志H616芯片香橙派Orange Pi Zero2开发板的26pinGPIO口测试

香橙派Zero2开发板采用全志H616 四核 64位处理器,拥有512MB/1GB 内存可选,集成千兆以太网、蓝牙5.0+双频WiFi、USB2....
发表于 06-09 17:56 536次 阅读
全志H616芯片香橙派Orange Pi Zero2开发板的26pinGPIO口测试

世界上最先进分布式版本控制系统Git介绍

前言 Git是目前最流行的版本控制工具,Linux,Android都是使用git进行管理。Githu....
的头像 FPGA之家 发表于 06-09 17:40 205次 阅读
世界上最先进分布式版本控制系统Git介绍

贴片压敏电阻常用封装可以用哪几种尺寸代码来表示?

贴片压敏电阻常用封装可以用哪几种尺寸代码来表示?...
发表于 06-07 07:16 0次 阅读
贴片压敏电阻常用封装可以用哪几种尺寸代码来表示?

代码优化的目的是什么?具体方法包括哪几种?

代码优化的目的是什么?具体方法包括哪几种? 代码优化工作有什么创新点? ...
发表于 06-03 06:17 0次 阅读
代码优化的目的是什么?具体方法包括哪几种?

如何在CC2430上加入特定的PAN ID入网?

如何在CC2430上加入特定的PAN ID入网?
发表于 06-03 06:16 0次 阅读
如何在CC2430上加入特定的PAN ID入网?