do {} while(0)在linux是一种很常见的用法。
用法1:
在判断语句中使用,避免混淆语句结构。
用do{}while(0)将语句包起来,避免干扰原有语句的结构。
例:
#define foo(a)/
do{
if(a == 0)dosomething();
}while(0);
if(x == 1)
foo(a);
else something();
如果不包起来,编译器将会按
if(x == 1)
if(a==0)dosomething();
else something();
解释,程序流程将会被 改变。
用法2:
避免使用goto语句
例:
int foo(){
//申请资源
int * p = malloc(sizeof(int));
do{
//出错,break;
}while(0);
//出错处理
free(p);
return -1;
}
如果不用do{}while(0)的话,程序将需要在每一个退出分支上编写同样的出错处理函数或采用goto语句跳转到出错处理分支中,程序的可读性下降,结构混乱。
用法3:
#define foo() { int x; x++; x++;}
if(a == 0)foo();
else dosomething();
以上代码存在语法错误,用do{}while(0)可以消除。
总结,do{}while(0)在宏定义中有广泛的应用,使用它可以产生通用性更强的宏定义,提高宏定义的适用性。在程序中使用可以消除goto语句,提供更清晰的代码结构。