0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

do{...} while(0U) 這種代碼的作用和意義

strongerHuang ? 來(lái)源:strongerHuang ? 作者:strongerHuang ? 2021-06-04 14:00 ? 次閱讀

在一些項(xiàng)目中,我們可能看到過(guò)很多,在學(xué)習(xí)的時(shí)候沒(méi)有見(jiàn)過(guò)的代碼,比如 do{...} while(0U) 這種代碼,在我們學(xué)習(xí)的時(shí)候可能很少見(jiàn),但實(shí)際項(xiàng)目中卻存在很多類似代碼。

今天就來(lái)講講關(guān)于 do{...} while(0U) 的內(nèi)容。

1

前言

很多初學(xué)者都不知道這個(gè)“do{...} while(0U)”作用和意義,甚至覺(jué)得這樣寫(xiě)的代碼復(fù)雜且沒(méi)意義。

相信使用過(guò)STM32Cube HAL庫(kù)的朋友都知道,源碼里面有許多do{...} while(0U)的宏定義語(yǔ)句。 今天講的主要知識(shí)點(diǎn)是:HAL庫(kù)中do{...} while(0U)作用和意義。 當(dāng)然,do{...} while(0U)不限于HAL庫(kù)中,適用于很多地方。

2

HAL庫(kù)中do{} while(0U)宏定義

在HAL庫(kù)中,很多.h文件都有do{...} while(0U)這樣的宏定義,比如:在stm32f1xx_hal_rcc.h中,使能GPIO時(shí)鐘

65bcab4a-c4b8-11eb-9e57-12bb97331649.jpg

對(duì)比在LL庫(kù)中時(shí)鐘使能代碼,如下:

65c9c73a-c4b8-11eb-9e57-12bb97331649.jpg

很多人只會(huì)覺(jué)得LL庫(kù)這種函數(shù)比較合理,而想不明白為什么HAL會(huì)使用這種“do{...} while(0U)”宏定義的語(yǔ)句。 下一章節(jié)重點(diǎn)講述一下這種“do{...} while(0U)”宏定義的作用和意義。

3

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

使用do{...} while(0U)這種方式其實(shí)有幾種重要作用,下面簡(jiǎn)單說(shuō)幾條:

1.編譯出錯(cuò)

不使用do{}while:

65d46a14-c4b8-11eb-9e57-12bb97331649.png

使用大括號(hào),多一個(gè)分號(hào):

65ebcb14-c4b8-11eb-9e57-12bb97331649.jpg

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

65fc6e6a-c4b8-11eb-9e57-12bb97331649.jpg

大家對(duì)比以上幾種,你覺(jué)得哪一種合理?

2.避免goto跳轉(zhuǎn)語(yǔ)句帶來(lái)問(wèn)題

不使用do{}hwile(0):

6606c112-c4b8-11eb-9e57-12bb97331649.jpg

使用do{}hwile(0):

6622dcbc-c4b8-11eb-9e57-12bb97331649.png

大家再對(duì)比以上兩種,發(fā)現(xiàn)了什么問(wèn)題?

我這里也不再繼續(xù)舉例說(shuō)明了,大家可以上網(wǎng)了解,其實(shí)還有很多重要意義和作用。

怎么說(shuō)呢,點(diǎn)到為止,希望對(duì)你有啟發(fā)。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4235

    瀏覽量

    61965
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4670

    瀏覽量

    67764
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1172

    瀏覽量

    51511
  • HAL
    HAL
    +關(guān)注

    關(guān)注

    2

    文章

    69

    瀏覽量

    12541

原文標(biāo)題:項(xiàng)目中大量使用do{...} while(0U)的作用和意義

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    stm32h5使用jlink調(diào)試器,在while (READ_BIT(RCC->CR, RCC_CR_PLL1RDY) == 0U)這里超時(shí)的原因?

    ,然后淘寶買了個(gè)jlink的調(diào)試器,就想試下,結(jié)果連上后,發(fā)現(xiàn)程序會(huì)在rcc初始化的時(shí)候,在 while (READ_BIT(RCC->CR, RCC_CR_PLL1RDY) == 0U)這里超時(shí),進(jìn)errorhandler
    發(fā)表于 05-27 07:36

    STM32 RTX CAN封裝庫(kù)中while循環(huán)無(wú)法跳出是為什么?

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

    使用STM32F407 USB HOST遇到的疑問(wèn)求解

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

    交換芯片的作用意義

    交換芯片作為網(wǎng)絡(luò)設(shè)備中的核心組件,其作用意義不可忽視。
    的頭像 發(fā)表于 03-18 14:34 ?469次閱讀

    FM0+ S6E1C-Series Starter Kit開(kāi)發(fā)板,I2SL0口通過(guò)中斷讀取出的數(shù)據(jù)始終為0,播放音頻可以是怎么回事?

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

    xmc1302使用官網(wǎng)的BLDC案例,一直出現(xiàn)卡在下面的函數(shù)出不來(lái)的原因?

    *) MOTOR0_BLDC_SCALAR_VADC_PHASEU_VOLTAGE_GRP); } while (vadc_conversion_status == 0U);希望各位大神指點(diǎn)一下,一直卡這里出不來(lái),不知道什么原因
    發(fā)表于 02-18 08:18

    arduino中while循環(huán)怎么跳出

    Arduino 是一款開(kāi)源的硬件平臺(tái),廣泛應(yīng)用于各種物聯(lián)網(wǎng)和嵌入式系統(tǒng)項(xiàng)目。在 Arduino 上編寫(xiě)代碼時(shí),循環(huán)結(jié)構(gòu)起到了至關(guān)重要的作用。而其中的 while 循環(huán)更是常用于需要根據(jù)特定條件重復(fù)
    的頭像 發(fā)表于 02-14 16:22 ?1826次閱讀

    while和if一起用的例子c語(yǔ)言

    一、 在C語(yǔ)言中,while和if是兩個(gè)非常常用的控制語(yǔ)句。while用于創(chuàng)建循環(huán)結(jié)構(gòu),使得程序可以重復(fù)執(zhí)行一段代碼塊,而if則是用于條件判斷,根據(jù)不同的條件執(zhí)行不同的代碼塊。當(dāng)這兩個(gè)
    的頭像 發(fā)表于 11-22 10:09 ?2567次閱讀

    while與if嵌套如何使用

    嵌套是編程中常用的一種技術(shù),它可以使代碼在特定條件下執(zhí)行不同的操作。在Python中,while循環(huán)和if條件語(yǔ)句經(jīng)常被嵌套使用,以實(shí)現(xiàn)更復(fù)雜的程序邏輯。 首先,我們來(lái)看一下while循環(huán)和if語(yǔ)句
    的頭像 發(fā)表于 11-22 10:06 ?2747次閱讀

    python中while的用法例子

    出數(shù)字1到10。 計(jì)算1到10之間所有數(shù)字的總和: i = 1 total = 0 while i 10 :total += ii += 1 print (total) 在上面的代碼中,我
    的頭像 發(fā)表于 11-22 10:04 ?1112次閱讀

    while循環(huán)用法格式

    while循環(huán)是一種常用的循環(huán)結(jié)構(gòu),能夠按照指定條件多次重復(fù)執(zhí)行一段代碼。它的一般用法格式如下: while 條件表達(dá)式:循環(huán)體 在執(zhí)行while循環(huán)時(shí),首先會(huì)判斷條件表達(dá)式的值。如果
    的頭像 發(fā)表于 11-22 10:02 ?1368次閱讀

    C語(yǔ)言中如何優(yōu)化代碼的執(zhí)行效率

    : unsigned int i;i= 1000 ; do { i--; //用戶程序 } while (i > 0 ); 在這兩種循環(huán)中,使用do
    的頭像 發(fā)表于 11-20 18:09 ?467次閱讀

    do{...} while(0)的四大使用場(chǎng)景介紹

    這里只針對(duì)單核CPU,linux內(nèi)核和其他一些開(kāi)源的代碼中,經(jīng)常會(huì)遇到這樣的代碼
    的頭像 發(fā)表于 11-14 12:18 ?774次閱讀

    MPC5746C Flexcan無(wú)法觸發(fā)接收中斷,無(wú)法接收SDK 3. 0的數(shù)據(jù)怎么解決?

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

    do{}while(0)只執(zhí)行一次有意義嗎?

    在嵌入式開(kāi)發(fā)中,宏定義非常強(qiáng)大也非常便捷,如果正確使用可以讓你的工作事半功倍。然而,在很多的C程序中,你可能會(huì)看到不是那么直接的比較特殊一點(diǎn)的宏定義,比如do{}while(0)。
    的頭像 發(fā)表于 10-09 14:20 ?521次閱讀
    <b class='flag-5'>do</b>{}<b class='flag-5'>while</b>(<b class='flag-5'>0</b>)只執(zhí)行一次有<b class='flag-5'>意義</b>嗎?