为了避免宏展开后与预期不符,do{}while(0)常在宏定义函数体有多句时使用(do{}while(0)后没有分号)。反例:
调用1:
if(flag)
Test();
则会出现逻辑错误,这种错误编译器并不会报错。上面的宏定义展开之后会变为以下格式:
if(flag)
Func_A();
Func_B();
调用2:
if(flag)
Test();
else...
编译出错,else独立于if语句。