有帮助吗?

解决方案

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)后。在这种形式这两种变体 当量。背后使用“做/而”版本是不是整个想法 包括这最后;到宏(我解释的原因 上文)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top