LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1015|回复: 7

一个简单的问题

[复制链接]
发表于 2006-2-12 11:47:05 | 显示全部楼层 |阅读模式
经常见到类似下面的代码:
  1. #define RECACHE  \
  2. do { ip = &instack[indepth];                \
  3.      ibp = ip->bufp;                        \
  4.      limit = ip->buf + ip->length;        \
  5.      op->bufp = obp;                        \
  6.      check_expand (op, limit - ibp);        \
  7.      beg_of_line = 0;                        \
  8.      obp = op->bufp; } while (0)
复制代码

我想问的就是那个do{}while(0)究竟有什么用处
发表于 2006-2-12 13:48:09 | 显示全部楼层
没用,为以后加东西用的吧。
回复 支持 反对

使用道具 举报

发表于 2006-2-12 21:51:36 | 显示全部楼层
我的理解:

如果这里有临时变量定义,将其作用域限定在 do...while block 之内。避免与外面的变量名冲突。
回复 支持 反对

使用道具 举报

发表于 2006-2-12 21:55:27 | 显示全部楼层
一个常见技巧, 为了使用方便.

快被讨论烂了!

参看 http://www.faqs.org/faqs/C-faq/faq/
问题 10.4

另, 发问前请先搜索. 实在要发问就拜托把题目写得明确些.
这样会节约你和大家的时间.
回复 支持 反对

使用道具 举报

发表于 2006-2-13 03:21:43 | 显示全部楼层
Post by MMMIX

参看 http://www.faqs.org/faqs/C-faq/faq/
问题 10.4


快速把这个文章看了一下,好像我说的不正确。but I dont care, Im not a programmer.

顺便问一下楼上的兄弟,类似的问题应该用什么样的关键字去搜索?
回复 支持 反对

使用道具 举报

发表于 2006-2-13 09:08:11 | 显示全部楼层
这种问题最好的办法一般是去搜索FAQ列表
回复 支持 反对

使用道具 举报

发表于 2006-2-13 23:22:32 | 显示全部楼层
Post by crspo
经常见到类似下面的代码:
  1. #define RECACHE  \
  2. do { ip = &instack[indepth];                \
  3.      ibp = ip->bufp;                        \
  4.      limit = ip->buf + ip->length;        \
  5.      op->bufp = obp;                        \
  6.      check_expand (op, limit - ibp);        \
  7.      beg_of_line = 0;                        \
  8.      obp = op->bufp; } while (0)
复制代码

我想问的就是那个do{}while(0)究竟有什么用处

偶们一样都是新手,我理解这种痛苦!主要是因为在定义宏的原因吧,因为“;”是好多编辑器进行语法分析的关键字符,比如说我调用这个宏的话我写成“RECACHE;”编辑器认为一行结束,然后下一行就会按正确的格式书写。但如果没有do()while(0)的话,写成“RECACHE”才是符合程序语法的,但这样编辑器就搞错了,后面格式大乱!
回复 支持 反对

使用道具 举报

发表于 2006-2-14 09:11:57 | 显示全部楼层
呵呵,这个其实并不是主要的。关键在于大型软件开发时,程序员经常记不清楚那些是宏,那些是函数。所以常常会在宏名之后加上逗号。如果写成do () while (0)的形式,就可以象函数名一样使用,不必再顾忌这样问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表