文章参考:(1条消息) C语言 -- do{…}while(0)的意义和用法_诸葛一帆丶的博客-CSDN博客
在学习STM32H743的代码过程中,经常碰到一些有关do{...}while(0)的宏定义。
如,在学习stm32h7xx_hal_rcc.h文件时,就有相关的宏定义:
#define __HAL_RCC_GPIOA_CLK_ENABLE() do { \
__IO uint32_t tmpreg; \
SET_BIT(RCC->AHB4ENR, RCC_AHB4ENR_GPIOAEN);\
/* Delay after an RCC peripheral clock enabling */ \
tmpreg = READ_BIT(RCC->AHB4ENR, RCC_AHB4ENR_GPIOAEN);\
UNUSED(tmpreg); \
} while(0)
我们都知道do{...}while{0}循环只执行一次,那么宏定义中使用do{...}while{0}循环意义何在呢?以下为我在学习过程中的一些感悟。仅供参考。
1.将定义的复杂的宏用作一个整体来引用。
举例,有时候在使用宏定义时,往往需要将多个C语句汇集到一起来定义一个宏。即使用宏定义来定义一个函数,用以实现某种功能,我们姑且称之为宏函数。如x,y比较大小,x大则x,y的值互换。反之x,y的值不互换。对此我们首先想到的宏定义使用方法为:
#define swap(x,y) temp=x; x=y; y=temp; //定义宏函数。<