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

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

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

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

strongerHuang ? 來源:strongerHuang ? 作者:strongerHuang ? 2021-06-04 14:00 ? 次閱讀

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

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

1

前言

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

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

2

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

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

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

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

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

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

3

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

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

1.編譯出錯

不使用do{}while:

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

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

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

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

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

大家對比以上幾種,你覺得哪一種合理?

2.避免goto跳轉(zhuǎn)語句帶來問題

不使用do{}hwile(0):

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

使用do{}hwile(0):

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

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

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

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

編輯:jq

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

    關(guān)注

    3

    文章

    4331

    瀏覽量

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

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68602
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1204

    瀏覽量

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

    關(guān)注

    2

    文章

    70

    瀏覽量

    12613

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    GD32F4xx_Demo_Suites里的PMU_Sleep_Wakeup如何從串口從deepsleep狀態(tài)喚醒?

    (EVAL_COM0_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,EVAL_COM0_RX_PIN); nvic_irq_enable(EXTI10_15_IRQn, 2U,
    發(fā)表于 09-27 06:33

    使用PIC32MK多電機(jī)開發(fā)板例程時(shí),用PICkit3將例程燒寫進(jìn)去以后,會卡在ADC初始化是為什么?

    == 0U) // Wait until the reference voltage is ready { /* Nothing to do */ } 請問這個(gè)是為什么呢?
    發(fā)表于 07-26 06:53

    ESP8266 I2C通信故障怎么解決?

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

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

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

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

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

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

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

    關(guān)于STM32F103 USB示例代碼的疑問求解

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

    USB庫函數(shù)里有些地方判斷CID寄存器的bit8位,1或0執(zhí)行不同操作,請問這位代表什么意思?

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

    交換芯片的作用意義

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

    FM0+ S6E1C-Series Starter Kit開發(fā)板,I2SL0口通過中斷讀取出的數(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ù)出不來的原因?

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

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

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

    psoc6 i2c讀寫時(shí)死循環(huán)是什么原因?qū)е碌模?/a>

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

    使用SRAM的模板IDE試運(yùn)行GPIO-LED示例,禁用了WCO后,運(yùn)行時(shí)一直卡住的原因?

    的 #if (CY_USE_PSVP == 0u) 改成#if (CY_USE_PSVP == 1u) LED就能正常工作了,但串口輸出是亂碼。 我知道,這等于忽略了所有時(shí)鐘設(shè)置,后續(xù)會出問題,所以不能采用這種方式 還有其它方
    發(fā)表于 02-02 08:31

    在XMC1300中將時(shí)鐘配置為32MHz時(shí)面臨的問題求解

    =XMC_SCU_CLOCK_PCLKSRC_MCLK;clock_config.fdiv = 0U; /**< Fractional divider */clock_config.idiv = 0U
    發(fā)表于 01-31 07:23