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{}语句块的一样,不能够被语句块以外访问,这是一个极大的麻烦。

原文地址:https://www.cnblogs.com/learn-my-life/p/4567300.html