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

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

3天内不再提示

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

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-03 14:07 次阅读

应部分老铁的要求,讲一些细节知识点。一来,我不用花费大量精力去写文章;二来,大家也不会因看文章觉得累。

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时钟

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

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

下一章节重点讲述一下这种“do{...} while(0U)”宏定义的作用和意义。

3

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

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

1.编译出错

不使用do{}while:

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

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

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

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

不使用do{}hwile(0):

使用do{}hwile(0):

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

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

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

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

    关注

    0

    文章

    48

    浏览量

    8927
  • stm32cubemx
    +关注

    关注

    5

    文章

    260

    浏览量

    14453
  • HAL库
    +关注

    关注

    1

    文章

    112

    浏览量

    5895
收藏 人收藏

    评论

    相关推荐

    STM32 hal无法接收串口数据是怎么回事?

    型号:STM32L432KC官方开发板 串口使用的是板载的USB下载口以及串口 用法: 在串口初始化后,while(1)之前调用 接收中断函数 HAL_UART_Receive_IT(),接收
    发表于 04-29 06:11

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

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

    STM32F4初始化USART调用HAL_USART_Receive_IT开启接收中断,HAL为什么要专门发0XFF?

    0xFF。 然后在HAL_USART_RxCpltCallback()中会接收到0x7F(不知从何而来),调用HAL_USART_Transmit()发送,函数返回
    发表于 04-18 07:43

    STM32F072C8T6 flash写入数据暂停异常是哪里的问题?

    Address, uint64_t Data) { HAL_StatusTypeDef status = HAL_ERROR; uint8_t index = 0U; uint8_t nbiterations
    发表于 04-18 06:26

    使用HAL的USB模块时,当设置要接收的数据长度为大于64字节时,无法从接收结束回调函数的原因?

    在使用HAL的USB模块时,使用了自定义的USB设备,发现了一个问题, 版本为1.1.1, 芯片为STM32F103T8 USB类型:自定义
    发表于 04-12 06:07

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

    一直不对 static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx) { uint32_t count = 0U
    发表于 04-03 06:11

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

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

    hal_initTickuwTickFreq的含义是什么?

    /uwTickFreq又是什么意思? 在stm32f1xx_hal.h定义如下: typedef enum { HAL_TICK_FREQ_10HZ= 100
    发表于 03-18 06:25

    do{}while(0)只执行一次有意义吗?

    在嵌入式开发中,宏定义非常强大也非常便捷,如果正确使用可以让你的工作事半功倍。然而,在很多的C程序中,你可能会看到不是那么直接的比较特殊一点的宏定义,比如do{}while(0)。
    的头像 发表于 10-09 14:20 270次阅读
    <b class='flag-5'>do</b>{}<b class='flag-5'>while</b>(0)只执行一次有<b class='flag-5'>意义</b>吗?

    WHILE语句如何执行

    ● 控制结构 – IF ... THEN – CASE ... OF ... – FOR ... TO ... DO ... – WHILE ... DO ... 该功能将影响指
    的头像 发表于 09-10 09:48 507次阅读
    <b class='flag-5'>WHILE</b>语句如何执行

    C语言中whiledo-while循环的用法

    循环是一种重要的控制结构,可以使程序重复执行一段代码,直到满足特定条件为止。在C语言中,whiledo-while是两种常用的循环结构,本文将详细介绍这两种循环的用法。
    发表于 08-18 16:35 1155次阅读
    C语言中<b class='flag-5'>while</b>和<b class='flag-5'>do-while</b>循环的用法

    如何才能读懂e203_hbirdv2里面的各种信号和定义作用

    怎么才能读懂e203_hbirdv2里面的各种信号和定义作用啊?实在不知道命名的是啥
    发表于 08-12 06:35

    为什么G4系列、G0系列的FDCAN没有LL,只有HAL

    为什么G4系列、G0系列的FDCAN没有LL,只有HAL。同时也没有flash的LL。各位大神可否解答一下
    发表于 08-09 08:21

    C语言-宏定义中使用do{...} while(0)到底图个啥

    在 Linux 内核中,经常会看到do{} while(0)这样的语句,许多人开始都会疑惑,认为do{} while(0)毫无意义,因为它只
    的头像 发表于 06-11 10:59 486次阅读

    逻辑运算符在do循环while循环中不起作用怎么处理?

    代码:(无效) msg = \\\"\\\" cnt = 1 do cnt = cnt + 1 delay 500 loop while len(msg) &
    发表于 05-10 07:28