Dict.CN 在线词典, 英语学习, 在线翻译
随笔-97  评论-326  文章-0  trackbacks-0
一段代:
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的结束。
对于宏后面不喜欢加分号的人,编译器提示:缺少分号,很容易发现错误,不再以为是什么障眼法了。
posted on 2007-07-18 15:43 笨笨 阅读(735) 评论(4)  编辑 收藏 引用 所属分类: 调试

评论:
# re: 消除障眼法-一个编译错误[未登录] 2007-07-18 17:56 | 梦在天涯
其实宏调用的后面不应该有;的  回复  更多评论
  
# re: 消除障眼法-一个编译错误 2007-07-19 10:14 | 沐枫
@梦在天涯
一致性是很重要的。没了一致性,不但这个库函数是很难用的,而且也是很容易出错的。  回复  更多评论
  
# re: 消除障眼法-一个编译错误 2007-08-18 11:05 | 风筝
讲的不错

不过如果养成一个习惯就是if - else 的分支加一个打扩弧能解决很多意想不到的错误,可以说包治百病呢!!  回复  更多评论
  
# re: 消除障眼法-一个编译错误 2007-09-21 12:25 | 探丫头
的确没遇到过这样的问题,不是很喜欢在这方面用宏,调试起来不是那么方便  回复  更多评论
  

标题  
姓名  
主页
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]
相关链接:
网站导航: