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

    文章

    3859

    浏览量

    61297
  • 代码
    +关注

    关注

    30

    文章

    4553

    浏览量

    66645
  • GPIO
    +关注

    关注

    16

    文章

    1129

    浏览量

    50482
  • HAL
    HAL
    +关注

    关注

    2

    文章

    68

    浏览量

    12463

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

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

收藏 人收藏

    评论

    相关推荐

    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

    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 596次阅读

    while和if一起用的例子c语言

    一、 在C语言中,while和if是两个非常常用的控制语句。while用于创建循环结构,使得程序可以重复执行一段代码块,而if则是用于条件判断,根据不同的条件执行不同的代码块。当这两个
    的头像 发表于 11-22 10:09 1127次阅读

    while与if嵌套如何使用

    嵌套是编程中常用的一种技术,它可以使代码在特定条件下执行不同的操作。在Python中,while循环和if条件语句经常被嵌套使用,以实现更复杂的程序逻辑。 首先,我们来看一下while循环和if语句
    的头像 发表于 11-22 10:06 1377次阅读

    python中while的用法例子

    Python中的while循环是一种重复执行代码块的结构,只有在指定条件为真时才会执行。当条件变为假时,循环停止。 下面是一些使用while循环的示例,每个示例都提供了详细的解释: 从1到10打印
    的头像 发表于 11-22 10:04 647次阅读

    C语言中如何优化代码的执行效率

    } 或: unsigned int i;i= 1000 ; do { i--; //用户程序 } while (i > 0 ); 在这两种循环中,使用dowhile循环编译后生成的
    的头像 发表于 11-20 18:09 309次阅读

    MPC5746C Flexcan无法触发接收中断,无法接收SDK 3. 0的数据怎么解决?

    , .enable_brs = false, .is_remote = false }; FLEXCAN_DRV_ConfigRxMb(0U, 0U,dataInfo, 0
    发表于 11-10 07:57

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

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

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

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

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

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

    Wemos D1 Do-while循环问题求解

    我一直在努力让 wemos 处理来自多个按钮的按钮按下。我正在使用 MQTT 构建远程控制单元。 我读取按钮的代码只是一系列 if 语句,但 Wemos 一直崩溃,所以我将其更改为 do-while
    发表于 06-06 11:17

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

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