do能确保大括号里的逻辑被执行,while(0)确保该逻辑只能被执行一次。
这个宏的好处与作用?
example 1:
#define middle(x) up(x); down(x)
调用 middle(aaa)
该宏被扩展成
up(aaa); down(aaa)
放在函数中使用:
if (bbb)
middle(aaa);
被扩展成
if (bbb)
up(aaa);
down(aaa);
这样就违背了初衷
但加上了do while,就能正常运行。
为什么不直接用 { }呢?
example 2 :
if (bbb)
middle(aaa);
else
lala(aaa);
扩展之后就是
if (bbb) {
up(aaa);
down(aaa)
};
else
lalala(aaa);
这样代码就存在错误了。
所以用 do{} while(0) 构造的宏就不会受到大括号、分号等的影响。