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

    文章

    51

    浏览量

    9364
  • stm32cubemx
    +关注

    关注

    5

    文章

    287

    浏览量

    17149
  • HAL库
    +关注

    关注

    1

    文章

    121

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    立即在GitHub上抢先体验面向STM32U5的最新STM32Cube HAL更新

    其满足您的需求。 如何获取预览版本 面向STM32U5系列的STM32Cube HAL2预览版已在GitHub代码STM32CubeU5-V2-Preview开放。 更新后的
    的头像 发表于 10-20 17:12 638次阅读

    RT_USING_TIMER_SOFT定义是否一定要开启?

    定义 :RT_USING_TIMER_SOFT 请问:如果没有使能软件定时器的定义,只在创建定时器时,通过RT_TIMER_FLAG_SOFT_TIMER是否可以创建一个软件定
    发表于 09-29 07:11

    SConscript结果与rtconfig.h定义相反,是什么原因呢?

    当我在rtconfig.h定义注释时,添加了构建 当我取消定义注释时,反而排除了构建 SConscript结果与rtconfig
    发表于 09-23 06:01

    基于STM32 HAL与标准的esp8266接入机智云方案(二)

    在《基于STM32HAL与标准的esp8266接入机智云方案(一)》,我们详细介绍了硬件连接和机智云客户端的创建。本篇将重点讲解如何下载代码、分析下载的代码,并直接使用这些代码连
    的头像 发表于 05-28 18:02 1116次阅读
    基于STM32 <b class='flag-5'>HAL</b><b class='flag-5'>库</b>与标准<b class='flag-5'>库</b>的esp8266接入机智云方案(二)

    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

    STM32F107的USART2为什么进不了中断?

    USART_RX_GPIO_PIN GPIO_PIN_6 #define USART_RX_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOD_CLK_ENABLE(); }while(
    发表于 03-14 16:57

    使用Hal的SPI读取磁边传感器导致STM32G4无法运行怎么解决?

    )) &amp;&amp; (hspi-&gt;TxXferCount &gt; 0U) &amp;&
    发表于 03-14 08:24

    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

    关于STM32 CAN通信发送函数HAL_CAN_AddTxMessage()的最后一个参数填0定义一个变量取地址的问题求解

    问题: 关于STM32 CAN通信 发送函数 HAL_CAN_AddTxMessage()的最后一个参数填0定义一个变量取地址的问题,如果直接传0,我实验发现 STM32F103C8
    发表于 03-11 08:22

    HAL和标准你会选择哪种

    HAL和标准你会选择哪种
    发表于 03-10 06:25

    如何将HAL转为LL

    怎么将HAL转为LL
    发表于 03-10 06:08

    const定义的是不是常量

    变成数字 5。 第二种跟定义类似,常量也可以在编译的时候通过编译器传入。 以 gcc 为例,编译的时候提供 -D 选项,同样会在预处理的时候替换成相应的数字。 第三种枚举,使用 enum 关键字。 枚举的特点是默认从 0 开始
    的头像 发表于 01-14 11:35 643次阅读

    定义后面能不能加分号

    用define定义,最后需不需要加分号?
    的头像 发表于 01-06 16:35 941次阅读