消除障眼法-一个编译错误

消除障眼法-一个编译错误

一段代:
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的结束。
对于宏后面不喜欢加分号的人,编译器提示:缺少分号,很容易发现错误,不再以为是什么障眼法了。

你可能感兴趣的:(消除障眼法-一个编译错误)