下面2个宏函数
A:
#define ASSERT(val) {if(!val) return -1;}
B:
#define ASSERT(val) do{if(!val) return -1;}while(0)
两者有何区别,难道do while在此简直是多此一举?
其实不是的,看下面的应用
if(cond)
ASSERT(val);
else
func();
A展开的结果是:
if(cond)
{
};
else
func();
------- 很明显,编译无法通过,else没有对应的 If 语句!
用B展开就没有这个问题!
因此建议用do while来代替域名符{ }防止非单行宏语句展开出错!