do{...}while(0)的作用

时间:2023-03-09 19:43:00
do{...}while(0)的作用

不是为了循环的while。

1.用于宏定义,保证宏一定按照想要的方式执行。

#define   foo(x)     start(x); end(x)

if(flag)

foo(x);

扩展以后的结果

if(flag)

start(x);

end(x);

如果是do{..}while(0)的形式,可以保证宏按照定义的预期执行,并且必定执行一次。

#define foo(x)   do{start(x);end(x)}while(0)

if(flag)

foo(x);

扩展以后的结果

if(flag)

do{

start(x);

end(x);

}

while(0)

会被正确执行。

其实这个我觉得宏也可以解决,加上作用域。

#define foo(x) {start(x); end(x)}

2. 替代goto完成多分支合并处理。

char *x = NULL;

if(type = PEOPLE)

{

x = malloc(sizeof(stPeople));

do something...

if(error)

goto end;

}

else if(type == MONKEY)

{

x = malloc(sizeof(stMonkey));

do something...

if(error)

goto end;

}

return 0;

end:

free(x);

return -1;

}

这种goto语句可以从多层分支中跳出来,集中处理公共事务。

相比goto的灵活,do{...}while(0)代码更清晰。

char *x = NULL;

do{

if(type = PEOPLE)

{

x = malloc(sizeof(stPeople));

do something...

if(error)

break;

}

else if(type == MONKEY)

{

x = malloc(sizeof(stMonkey));

do something...

if(error)

break;

}

return 0;

}

while(0)

free(x);

return -1;

}

但也不是绝对的,{}范围内是局部变量,和try{}语句块的一样,不能够被语句块以外访问,这是一个极大的麻烦。