免费注册 查看新帖 |

Chinaunix

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

do-while(0)的宏定义似乎没存在的必要. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-22 11:27 |只看该作者 |倒序浏览
使用do-while(0)的宏定义是为了防止if-else( if)的语法错误, 但使用({})也可以避免, 后者的好处是可以避免一次无用计算.


  1. #define FOO(times) \
  2.         ({ \
  3.                 int i; \
  4.                 time_t tm; \
  5.                 time(&tm); \
  6.                 for (i = 0; i < times; i++) \
  7.                         printf("---%d---\n", i); \
  8.                 printf("It takes %d secondes\n", time(NULL) - tm); \
  9.          })
复制代码

使用

  1. if (XXX)
  2.           FOO(n);
  3. else
  4.           bar();
复制代码

是不会编译出错的.

不知道是不是还有其他的语法陷阱必须使用do-while(0)解决?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2007-06-22 11:28 |只看该作者
但是 ({}) 是非标准的。不知道除 gcc 之外还有谁支持它?

论坛徽章:
0
3 [报告]
发表于 2007-06-22 11:32 |只看该作者
果然, 我在VC6.0下面编译出错

论坛徽章:
0
4 [报告]
发表于 2007-06-22 11:34 |只看该作者
原帖由 accelerator 于 2007-6-22 11:27 发表
使用do-while(0)的宏定义是为了防止if-else( if)的语法错误, 但使用({})也可以避免, 后者的好处是可以避免一次无用计算.


do-while(0)在效率上和{}无区别。

论坛徽章:
0
5 [报告]
发表于 2007-06-22 11:43 |只看该作者
LS的厉害, 我刚才对比了一下汇编语句, 发现的确是相同的.

以前一直认为do-while(0)会在运行时进行判断, 这样看来这个判断应该是编译时的行为. Am I right?

论坛徽章:
0
6 [报告]
发表于 2007-06-22 11:43 |只看该作者
原帖由 flw 于 2007-6-22 11:28 发表
但是 ({}) 是非标准的。不知道除 gcc 之外还有谁支持它?

呵呵,斑竹就是斑zhu,一语中第!

论坛徽章:
0
7 [报告]
发表于 2007-06-22 11:45 |只看该作者
do while(0) 编译后就没有了。不影响效率

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2007-06-22 11:52 |只看该作者
原帖由 accelerator 于 2007-6-22 11:43 发表
LS的厉害, 我刚才对比了一下汇编语句, 发现的确是相同的.

以前一直认为do-while(0)会在运行时进行判断, 这样看来这个判断应该是编译时的行为. Am I right?

编译器不会那么傻的。

论坛徽章:
0
9 [报告]
发表于 2007-06-22 12:19 |只看该作者
原帖由 flw 于 2007-6-22 11:52 发表

编译器不会那么傻的。


呵呵, 以前不知道从哪里看到有说
while (1) {
}
的效率没有
for ( ; ; ) {
}
高, 今天特意比较了一下编译结果, 也是一样的

论坛徽章:
0
10 [报告]
发表于 2007-06-22 12:23 |只看该作者
问个问题:do-while(0)开不开编译器优化相同吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP