宏定义代码块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) 把它包裹起来,成为一个独立的语法单元,从而不会与上下文发生混淆,为了解决宏定义在使用时可能引发的一些问题,确保宏定义可以作为单个语句使用,并且在逻辑上看起来像是一个语句。