免费注册 查看新帖 |

Chinaunix

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

do {} while(0); 到底有什么作用。 [复制链接]

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-16 12:25 |只看该作者 |倒序浏览
如题,把一个宏定义成do {} while(0);  到底有什么作用。

请教。

论坛徽章:
0
2 [报告]
发表于 2005-12-16 12:36 |只看该作者
可以使用break代替goto语句

论坛徽章:
0
3 [报告]
发表于 2005-12-16 12:41 |只看该作者
用在宏里面。
当宏里面有if时,可以起到封闭代码作用,防止与外面的 if 混淆。

比如定义宏,#define FREE1(p) if (p) free (p)

而在代码部分这样调用宏:
if (expression)
FREE1(p)
else
printf(“expression was false.\n”) ;

展开后,else会和宏中的if配对了,这就错了。但是宏写成如下的形式就永远不会错了
#define FREE4(P)  do { if (p) free(p)}; while (0)

论坛徽章:
0
4 [报告]
发表于 2005-12-16 12:45 |只看该作者
原帖由 草草 于 2005-12-16 12:41 发表
用在宏里面。
当宏里面有if时,可以起到封闭代码作用,防止与外面的 if 混淆。

比如定义宏,#define FREE1(p) if (p) free (p)

而在代码部分这样调用宏:
if (expression)
FREE1(p)
else
printf(“exp ...



这根直接封个大括号有什么区别。还用得着do while?

论坛徽章:
0
5 [报告]
发表于 2005-12-16 12:55 |只看该作者
当然有差别!
《Linux内核注释》这本书里有一段专门讲这个的,懒得抄写了,可以自己找来看看。在看之前我也是百思不得其解的,看后才感到,kernel写的果然处处是技巧。

论坛徽章:
0
6 [报告]
发表于 2005-12-16 12:56 |只看该作者
原帖由 wqmmmmm 于 2005-12-16 12:45 发表



这根直接封个大括号有什么区别。还用得着do while?


你仔细理解一下:
#define FREE1(p) {if (p) free (p) }


if (expression)
FREE1(p)
else
printf(“expression was false.\n”) ;

预处理之后,就变成了这样:
if (expression)
  {if (p) free (p) };
else
  printf(“expression was false.\n”) ;


仔细看看{}后面那个分号,明白了吧?

论坛徽章:
0
7 [报告]
发表于 2005-12-16 13:00 |只看该作者
原帖由 albcamus 于 2005-12-16 12:56 发表


你仔细理解一下:
#define FREE1(p) {if (p) free (p) }


if (expression)
FREE1(p)
else
printf(“expression was false.\n”) ;

预处理之后,就变成了这样:
if (expression)
  {if (p) free ...


这也怪不得别人反问草草了,因为他举的例子中,把;号给忽略了,所以给别人造成了误解……

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
8 [报告]
发表于 2005-12-16 13:14 |只看该作者
谢谢草草,albcamus,独孤九贱,wqmmmmm。

wqmmmmm看题不仔细,答非所问,以后要细心点

论坛徽章:
0
9 [报告]
发表于 2005-12-16 13:19 |只看该作者
没见过 do {} while(0); 这种宏,
只见过 do {} while(0) 这种宏

论坛徽章:
0
10 [报告]
发表于 2005-12-16 13:26 |只看该作者
原帖由 思平 于 2005-12-16 13:19 发表
没见过 do {} while(0); 这种宏,
只见过 do {} while(0) 这种宏


真见过,在那个RO私服的Athena源码里...

[ 本帖最后由 zalem 于 2005-12-16 13:28 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP