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

    文章

    4365

    浏览量

    63873
  • 代码
    +关注

    关注

    30

    文章

    4880

    浏览量

    70025
  • GPIO
    +关注

    关注

    16

    文章

    1238

    浏览量

    53327
  • HAL
    HAL
    +关注

    关注

    2

    文章

    71

    浏览量

    12929

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

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

收藏 人收藏

    评论

    相关推荐

    STM32U5 IWDG的提前唤醒中断无法在STOP模式下触发怎么解决?

    was resumed from stop 2 */ if(__HAL_PWR_GET_FLAG(PWR_FLAG_STOPF) == 0U) {} /* Clear stop flag
    发表于 04-27 08:05

    STM32U5 IWDG的提前唤醒中断无法在STOP模式下触发怎么解决?

    was resumed from stop 2 */ if(__HAL_PWR_GET_FLAG(PWR_FLAG_STOPF) == 0U) {} /* Clear stop flag
    发表于 04-24 07:50

    STM32U5 IWDG的提前唤醒中断无法在STOP模式下触发怎么解决?

    was resumed from stop 2 */ if(__HAL_PWR_GET_FLAG(PWR_FLAG_STOPF) == 0U) {} /* Clear stop flag
    发表于 04-22 08:14

    STM32H743程序启动卡在了while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == 0U),怎么解决?

    使用了STM32H743的MCU,程序启动卡在了while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == 0U),外部低速时钟用示波器测量可以正常起振,电容容值12pF。
    发表于 03-14 07:00

    养成良好的编程习惯|堆内存初值不一定是0

    );    char ch; int i = 0; while ((ch = getchar()) != '') { *(s + i++) = ch; } printf("%s", s); return 0
    的头像 发表于 12-18 09:14 303次阅读

    物联网中RTU的DO是什么?如何实现DO相关软件功能?

    DO 即数字输出(DO, Digital Output),用于输出二进制信号,可以控制继电器、灯光、电机启停等。数字输出同样只能有两种状态:高电平或低电平。
    的头像 发表于 09-29 11:48 1193次阅读
    物联网中RTU的<b class='flag-5'>DO</b>是什么?如何实现<b class='flag-5'>DO</b>相关软件功能?

    GD32F4xx_Demo_Suites里的PMU_Sleep_Wakeup如何从串口从deepsleep状态唤醒?

    (EVAL_COM0_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,EVAL_COM0_RX_PIN); nvic_irq_enable(EXTI10_15_IRQn, 2U,
    发表于 09-27 06:33

    DO传感器有什么作用

    在环境保护与水资源管理日益重要的今天,溶解氧作为评估水质健康状况的关键指标之一,其准确、快速的监测对于保护水生态系统、预防水体污染及指导水处理工艺具有重要的价值。随着科技的进步,一种基于荧光法测量原理的DO传感器正逐步成为水质监测领域的重要工具。
    的头像 发表于 09-20 16:22 526次阅读

    使用PIC32MK多电机开发板例程时,用PICkit3将例程烧写进去以后,会卡在ADC初始化是为什么?

    == 0U) // Wait until the reference voltage is ready { /* Nothing to do */ } 请问这个是为什么呢?
    发表于 07-26 06:53

    PSOC 4200M看门狗计时器没有重置,请问问题出在哪里?

    哪里? #include #include #define LED_ON (0u) #define LED_OFF (1u) // 全局变量 //uint8 ledState = LED_OFF
    发表于 07-22 08:26

    ESP8266 I2C通信故障怎么解决?

    the \'$\' in frameLength_u16 tries */ { counter_u16 = 0u; gnrmcFrame_tu8[counter_u16] = i2c
    发表于 07-19 06:50

    GPDMA0至USIC0,第一个DMA启动后下一 DMA启动后就不一样了,为什么?

    interrupt priority */.sub_priority = 0U/* Node interrupt sub-priority */};GLOBAL_DMA_t GLOBAL_DMA0
    发表于 05-28 07:18

    stm32h5使用jlink调试器,在while (READ_BIT(RCC-&gt;CR, RCC_CR_PLL1RDY) == 0U)这里超时的原因?

    ,然后淘宝买了个jlink的调试器,就想试下,结果连上后,发现程序会在rcc初始化的时候,在 while (READ_BIT(RCC->CR, RCC_CR_PLL1RDY) == 0U)这里超时,进errorhandler
    发表于 05-27 07:36

    无损检测有哪些实际意义作用

    作用。本文将详细介绍无损检测的实际意义作用。 一、无损检测的定义和分类 无损检测是一种检测方法,它能够在不破坏被检测对象的情况下,评估其内部和表面的质量。无损检测威廉希尔官方网站 广泛应用于各个领域,如航空航天、核能、石油化工、机械制造、
    的头像 发表于 05-24 15:03 2021次阅读

    si4463发完上电命令(POWER_UP)后 ,为什么返回的都是0xff?

    子程序,大家 void MYSI446X_WAIT_CTS(void) { u8 cts=0; do { SI_CSN_LOW; SPI1_ReadWriteByte( READ_CMD_BUFF
    发表于 05-13 07:45