0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

strongerHuang 来源:strongerHuang 作者: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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4423

    浏览量

    68034
  • 代码
    +关注

    关注

    30

    文章

    4983

    浏览量

    74533
  • GPIO
    +关注

    关注

    16

    文章

    1336

    浏览量

    56587
  • HAL
    HAL
    +关注

    关注

    2

    文章

    75

    浏览量

    13787

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FlexPWM 输出在 RT1060 上不起作用是怎么回事?如何解决?

    ) ===============================*/ IOMUXC_SetPinMux(IOMUXC_gpio_sd_b1_02_FLEXPWM2_PWMA03, 0U); IOMUXC_SetPinMux
    发表于 05-13 07:08

    AD734使用外部分母,DD,U0,U1,U2怎么接?

    AD734使用外部分母,DD,U0,U1,U2怎么接?
    发表于 05-08 07:26

    S32K148 FlexCAN模块无法接收远程帧,为什么?

    buffCfg = { .enableFD = 假, .enableBRS = false, .fdPadding = 0U, .idType = CAN_MSG_ID_STD, .isRemote
    发表于 04-24 06:55

    将 WAKEUP 引脚用作普通GPIO13_IO0,LPUART2有问题,怎么解决?

    (gpc_cpu_mode_ctrl); gpio_pin_config_t USER_Pin_config = { .direction = kGPIO_DigitalInput, .输出逻辑 = 0U
    发表于 04-24 06:25

    S32K314导入ECC公钥ImportEccKeyReq函数返回错误0x055A5A399怎么解决?

    , 1U, WRP_ECC_KEY_SIZE}, { 0U, 0U, 0U, 0U, 0U
    发表于 03-16 07:06

    S32K3 OTA 演示示例在 EVB 上复位后无法启动S32K358怎么解决?

    )。用于OTA无源映像 */ 2. 在 main() 中 uint8_t DCMOTAR = 0u;0:低地址,1:高地址 uint8_t DCMOTAA = 0u;0:非活动,1:活
    发表于 03-06 07:59

    ADC单通道的转换

    ); while(1) { #ifdef SGL_MORE_MODE_EN while(!(gFlagIrqADC_ISR_EOA_Msk)); gFlagIrq = 0u; ADC_GetAccResult
    发表于 01-27 10:42

    深入解析rk平台Android Bootloader核心代码:从启动流程到AVB验证

    U-Boot中Android Bootloader的核心实现,核心作用是 衔接硬件初始化与内核启动 ,主要负责: •读写Bootloader控制块(BCB),判断设备启动
    的头像 发表于 01-22 07:06 587次阅读
    深入解析rk平台Android Bootloader核心<b class='flag-5'>代码</b>:从启动流程到AVB验证

    C语言中实现函数宏的三种方式

    在宏的第一个分号后便结束。即 a = b 和 b = tmp 均不受控制语句所作用。 因此,在工程中,一般使用三种方式来对函数宏进行封装,分别为 {}、do{...}while(0
    发表于 12-29 07:34

    【瑞萨RA6E2地奇星开发板试用】+ 2.串口打印测试

    ) { unsigned int k=0; do { uart0_Send_Byte ((str + k)); k++; } while(k < strlen); } void
    发表于 12-08 16:41

    深入理解 RK3506 U-Boot 重定位:从代码到原理

     U-Boot 代码从初始加载地址(通常是片内 ROM 或 Flash)复制到运行效率更高的片外 RAM,再切换执行环境到 RAM 中运行。 本文将结合 U-Boot 源码中 ARM Cortex 核心
    的头像 发表于 11-28 07:05 1125次阅读
    深入理解 RK3506 <b class='flag-5'>U</b>-Boot 重定位:从<b class='flag-5'>代码</b>到原理

    rt_mq_recv函数中timeout作用是什么?

    的值,并不被使用。 请问下这部分代码作用是什么了? /* message queue is empty */ while (mq-&gt;entry == 0
    发表于 09-29 06:27

    求助,关于rt-smart用户态线程实时性差的问题求解

    timespec period = {0U, 50000U}; /* 5.0E-5 seconds */ int step_sem_value; int i; (void)param_unused
    发表于 09-26 08:25

    请问如何创建在 RAM 区域完全独立运行的闪存驱动程序代码

    Pattern Requirements) */ SCU_WDTS_CON0.U = (1 << 0u) | (0 << 1u
    发表于 07-25 07:33

    【RA-Eco-RA6M4开发板评测】2、I2C外设驱动OLED屏幕和移植u8g2

    Delay的回调函数实现; 与通讯接口(比如I2C、SPI)相关的数据传输回调函数。 这两个函数的实现在u8g2 Wiki手册中可以找到相关的代码实现模板。 移植u8g2 在RASC中设置开发板的I2C
    发表于 07-23 13:51