免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4957 | 回复: 20
打印 上一主题 下一主题

do {} while (0) 的 Warning问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-19 23:07 |只看该作者 |倒序浏览
C 里面可以用do {} while (0) 来简单地模拟C++的异常处理,这个用法很多人都知道了。不过令我有些小小郁闷的是,这种写法在VC(即使是VC2008)总是有一个warning,说条件表达式为常量。

问题:有没有什么办法能够避免这个warning?(在不换编译器,不粗暴地disable这个warning的前提下)

我在网上看到一种解决方案,就是把 while(0) 用 while(__LINE__ == -1)代替,我试了一下,在有些编译器下可以逃掉warning,但是在VC2008下还是不行 (Warning level 4)。

还有其它的方法吗?请大家赐教一下。

论坛徽章:
0
2 [报告]
发表于 2010-04-19 23:13 |只看该作者
这个warning可以忽略,因为那是MSVC自作聪明的SB。

论坛徽章:
0
3 [报告]
发表于 2010-04-19 23:30 |只看该作者
我知道可以忽略,是的,MSVC是SB了一点,有时候连 argc 和 argv 没使用都会报warning。

但是我有轻微洁癖,一般情况下不希望出现任何warning。

有什么在程序级别上可以解决的办法么?

论坛徽章:
0
4 [报告]
发表于 2010-04-19 23:45 |只看该作者
跟编译器较什么真,它warning就让它warning呗,这不是跟自己过不去吗

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
5 [报告]
发表于 2010-04-19 23:48 |只看该作者
/W4不是什么好东西, 少用。 我以前也信这个, 现在只当它是狗屎。

用/W4, 外加有洁癖   用/analyze吗? 用/WX吗?
少点强迫症, 生活更开心


只/W4 办法是有的:

  1. do {
  2.       ...
  3. } while (0,0);
复制代码
副作用:
1. gcc不高兴了
2. cl ... /analyze 同样不高兴了

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
6 [报告]
发表于 2010-04-19 23:54 |只看该作者
再补充一下, 这可不是什么异常处理; 异常处理可比这个复杂得多。

do while(0)的这种用法:


  1. initialization code

  2. do {

  3.       if ( error )
  4.             break;

  5.       if ( error )
  6.             break;

  7.       if ( error )
  8.             break;

  9. } while (0);

  10. cleanup code

复制代码
其实只是一个单入口单出口goto美化版

异常的退出路径可多得多。

论坛徽章:
0
7 [报告]
发表于 2010-04-20 00:04 |只看该作者
本帖最后由 numdisp 于 2010-04-20 00:06 编辑

回复 6# OwnWaterloo

说说而已嘛,何必那么认真呢……
再说了,又不是写科研文章发到science,没必要那么抠字眼吧?

不过可否详细解释一下,/W4为什么“狗屎”呢?我一直以为它和gcc 的 -Wall相当的(感觉而已,大侠莫要再抠字眼了)。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
8 [报告]
发表于 2010-04-20 00:11 |只看该作者
回复 7# numdisp

看来你已经学会了“选择性较真”, 这很好。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
9 [报告]
发表于 2010-04-20 00:14 |只看该作者
回复 7# numdisp

msvc自带的crt的头文件, 以及ms的winsdk, mfc, alt都通不过/W4。
用/W4不但要擦自己的屁股, 还要擦它们的, 不是自己给自己不愉快么……

论坛徽章:
0
10 [报告]
发表于 2010-04-20 00:40 |只看该作者
算了,跑题了,do while (0) 的问题有解么,如果只考虑同时 Vc 和 gcc的话?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP