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

    文章

    4304

    浏览量

    62425
  • 代码
    +关注

    关注

    30

    文章

    4742

    浏览量

    68340
  • GPIO
    +关注

    关注

    16

    文章

    1196

    浏览量

    51905
  • HAL
    HAL
    +关注

    关注

    2

    文章

    70

    浏览量

    12592

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

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

收藏 人收藏

    评论

    相关推荐

    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

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

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

    ESP8266 I2C通信故障怎么解决?

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

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

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

    STM32 RTX CAN封装库中while循环无法跳出是为什么?

    ;MCRCAN_MCR_RESET) != 0U); #defineCAN_MCR_RESET((uint16_t)0x8000)/*!< CAN software master
    发表于 04-19 07:58

    使用STM32F407 USB HOST遇到的疑问求解

    ; } } while ((USBx->GRSTCTLUSB_OTG_GRSTCTL_AHBIDL) == 0U); /* Core Soft Reset */ count = 0U
    发表于 04-03 06:11

    关于STM32F103 USB示例代码的疑问求解

    + (((uint32_t)(bEpNum) * 8U) * PMA_ACCESS)); *_wRegVal = ((wAddr) >> 1) << 1; } while(0) /* PCD_SE
    发表于 03-27 07:14

    USB库函数里有些地方判断CID寄存器的bit8位,1或0执行不同操作,请问这位代表什么意思?

    ); } if ((dma == 0U) (hc->do_ping == 1U)) { (void)USB_DoPing(USBx, hc->ch_num); return HAL_OK; } }
    发表于 03-25 08:18

    交换芯片的作用意义

    交换芯片作为网络设备中的核心组件,其作用意义不可忽视。
    的头像 发表于 03-18 14:34 585次阅读

    FM0+ S6E1C-Series Starter Kit开发板,I2SL0口通过中断读取出的数据始终为0,播放音频可以是怎么回事?

    dB stcWm8731Reg.LLIN_f.LINMUTE = 1u;// Enable left channel line input mute stcWm8731Reg.LLIN_f.LRINBOTH = 0u
    发表于 02-21 06:47

    xmc1302使用官网的BLDC案例,一直出现卡在下面的函数出不来的原因?

    *) MOTOR0_BLDC_SCALAR_VADC_PHASEU_VOLTAGE_GRP); } while (vadc_conversion_status == 0U);希望各位大神指点一下,一直卡这里出不来,不知道什么原因
    发表于 02-18 08:18

    arduino中while循环怎么跳出

    Arduino 是一款开源的硬件平台,广泛应用于各种物联网和嵌入式系统项目。在 Arduino 上编写代码时,循环结构起到了至关重要的作用。而其中的 while 循环更是常用于需要根据特定条件重复
    的头像 发表于 02-14 16:22 2385次阅读

    psoc6 i2c读写时死循环是什么原因导致的?

    ; uint8_t readBuffer [5UL]; uint8_t writeBuffer[2UL] = {0U, 5U}; /* Configure write transaction
    发表于 02-02 11:02

    使用SRAM的模板IDE试运行GPIO-LED示例,禁用了WCO后,运行时一直卡住的原因?

    的 #if (CY_USE_PSVP == 0u) 改成#if (CY_USE_PSVP == 1u) LED就能正常工作了,但串口输出是乱码。 我知道,这等于忽略了所有时钟设置,后续会出问题,所以不能采用这种方式 还有其它方
    发表于 02-02 08:31

    ADC_DAC_Playback(SHARC)在里面添加访问UART的程序,为什么只添加了UART初始化代码

    主() { ** ** * 初始化管理下的司机和(或)服务 * 项目。 @ @ 成功时返回零 */ 5int32_t 结果 = 0u; 金特32_t i; * 配置系统事件控制器
    发表于 11-29 08:05