do{} while(0)的用处

1242阅读 0评论2009-05-12 bsdc
分类:

经常看到manpages里有类似
#define handle_error(msg) \
           do { perror(msg); exit(EXIT_FAILURE); } while (0)
看到一次也没在意,看多了,感觉怎么那么别扭,就搜索了一下,发现的确是有来头的:

 #define FOO(x) { do_this(x); do_that(); }
如下情况就会有错误,大括号外多了分号
 if (x>y)
FOO(x);
else
FOO(y);
但,可以解决,写成
if (x>y)
FOO(x)
else
FOO(y)
不过很别扭,而且很容易混淆,忘记

如果这样定义
#define FOO(x) do_this(x); do_that();
那导致do_that();多出来造成语法错误

所以,这样定义
#define FOO(x) do { do_this(x); do_that(); } while(0)

接下来它就把几个语句包裹起来了。
上一篇:Unix 网络编程开发环境
下一篇:Everything2 counting 1 bits C implementations[zt]