Dict.CN 在线词典, 英语学习, 在线翻译

学海苦作舟,书山勤为径

留下点回忆

常用链接

统计

积分与排名

Denoise

English study

Web技术

数据压缩

一些连接

最新评论

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

一段代:
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 笨笨 阅读(1156) 评论(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 探丫头

的确没遇到过这样的问题,不是很喜欢在这方面用宏,调试起来不是那么方便  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理