题
<强>可能显示的文件:强>结果 什么用做的,而(0)时,我们定义一个宏?结果 为什么有时会出现毫无意义的做/同时,如果在C / C ++宏/ else语句? 结果 做{...}而(0)有什么好处?一>
我已经看到了一些多线C宏包裹一个do内部/同时(0)循环如下:
#define FOO \ do { \ do_stuff_here \ do_more_stuff \ } while (0)
什么是编写代码这种方式,而不是使用一个基本块的好处(如果有的话):
#define FOO \ { \ do_stuff_here \ do_more_stuff \ }
解决方案
http://bytes.com/groups/c/ 219859-DO-而-O-宏取代
安德烈Tarasevich:
使用“做/而”版本是使一个宏这将整个构思 扩展成一个普通的语句,不进一家复合语句。这是 为了使使用功能,风格进行统一宏与 在所有上下文中使用的普通功能。
考虑下面的代码草图
if (<condition>)
foo(a);
else
bar(a);
其中“富”和“酒吧”是普通功能。现在想象一下,你会 想用的上述性质宏来替换功能“富”
if (<condition>)
CALL_FUNCS(a);
else
bar(a);
现在,如果宏是根据定义的第二种方法 (只是“{”和“}”)的代码将不再编译,因为“真” 分支“如果”现在由复合语句表示。当你 把一个“;”这个复合语句后,就完成了整个“如果” 语句,从而成为孤儿的“其他”分支(因此编译错误)。
要解决此问题的方法之一是要记住不要把“;”后 宏 “调用”
if (<condition>)
CALL_FUNCS(a)
else
bar(a);
这将编译并如预期工作,但这不是均匀的。该 更优雅的解决方案是确保宏观扩展成正 声明中,不进一家化合物中的一个。实现的方法之一就是定义 宏如下
#define CALL_FUNCS(x) \
do { \
func1(x); \
func2(x); \
func3(x); \
} while (0)
现在这个代码
if (<condition>)
CALL_FUNCS(a);
else
bar(a);
将编译没有任何问题。
但是,请注意我的定义之间的微小但重要的区别
的CALL_FUNCS
和邮件中的第一个版本。我没放
;
后} while (0)
。把一个;
在该定义的结尾
马上会破坏使用的整个点“做/同时”,使
该宏几乎等同于化合物语句版本。
我不知道为什么代码的作者您在最初报价
消息把这个;
while (0)
后。在这种形式这两种变体
当量。背后使用“做/而”版本是不是整个想法
包括这最后;
到宏(我解释的原因
上文)。