一段代:
if(0== nRet)
CM_INFO_TRACE_THIS("successfull");
else
CM_INFO_TRACE_THIS("fail");
编译出错,提示:else没有匹配的if。
看起来上面没有任何错误,我开始怀疑我的眼睛被使了障眼法,其实没有什么障眼法,问题在于CM_INFO_TRACE_THIS这个宏;看一下:
#define CM_INFO_TRACE_THIS(str) {TRACE(str);}
这样就可以很显然看出问题了,确实else是没有匹配的if,因为if语句已经结束了。
这个就是宏定义的毛病;记得一个朋友也提过,可以用do...while来终结这种问题,如:
#define CM_INFO_TRACE_THIS(str) do{TRACE(str);}while(0)
那么现在发生什么变化了?
虽然在宏的后面多了一个分号,但这刚好是while的结束。
对于宏后面不喜欢加分号的人,编译器提示:缺少分号,很容易发现错误,不再以为是什么障眼法了。