宏定义代码块do{ }while(0)

c语言代码中,存在大量的宏定义语句,宏定义本质是在预编译时的简单替换
注意到下面的代码宏定义如下:
#define cam_debug(fmt, ...)   \
    do {\
        if (debug & BIT(2)) {   \
            printk("CAM_DEBUG " fmt, __FILE__, __func__, __LINE__, ##__VA_ARGS__);    \
        }       \
    } while (0)
上面中属于一个子系统里面的log设计方案,当然可以这样使用它:
cam_debug("test \n");

// 打印如下
CAM_DEBUG test
为啥要加do {} while(0)呢,目的是将这个判断语句当成一个单独的表达式,这个在日志系统是十分常见的。
一般不会在while(0)后面加上分号“;”,个人认为这样是为了格式统一,如果写成do {} while(0);,那么在写打印日志的时候就写成下面的格式了:
cam_debug("test \n")
这样就感觉不太符合程序员去看
 
宏定义解决的问题:
#define EXECUTE() 
        do1(); 
        do2(); 

if(a>0)
    EXECUTE();

展开后:
if(a>0)
    do1();
    do2();
上面的例子无论a是否大于0,都会执行do2()函数,显然,这不是要执行的
 
总结:
使用do{….}while(0) 把它包裹起来,成为一个独立的语法单元,从而不会与上下文发生混淆,为了解决宏定义在使用时可能引发的一些问题,确保宏定义可以作为单个语句使用,并且在逻辑上看起来像是一个语句。
 
posted @ 2024-03-05 22:10  lethe1203  阅读(93)  评论(0编辑  收藏  举报