【发布时间】:2021-04-14 22:56:55
【问题描述】:
在我的代码中,我使用了一个宏,它应该生成一个日志条目,或者它不应该根据某些编译标志:
#ifdef SOMETHING
#define LOG(a) printf ("%s", a)
#else
#define LOG(a) while (0) {}
#endif
这段代码运行良好,但是当我在互联网上查看时,我只看到有人在使用
#define LOG(a) do {} while (0)
而不是
#define LOG(a) while (0) {}
这两种方法是否等效?我应该更喜欢一个吗?
【问题讨论】:
-
您为什么自己尝试并查看预处理后的输出?
-
请记住,宏可以有 no 主体,即
#define LOG(a) /* empty */是一个有效的宏。然后LOG("Some text");将扩展为/* empty */;,这是一个(空)语句。 -
@P__JsupportswomeninPoland :也许是因为在尝试时它可能会起作用。在非常特殊的情况下这是一个问题。
-
@Clifford do {} 而宏也适用于
very specific circumstances。人们不尝试,他们试图学习“简单”的方法。但它不起作用。我想知道:没有互联网和论坛,我怎么能学习编程? -
@P__JsupportswomeninPoland 我明白你在说什么,有时答案是“试一试”,但同样,人们设计了有缺陷的实验,或者曲解了结果,或者经常得出笼统的结论未定义行为的结论。最后一个问题是“我应该更喜欢一个吗?”
标签: c while-loop macros do-while