我已经在 glibc 中看到了调试 printfs,如果定义了 NDEBUG ,则内部定义为 (void) 0
。同样,Visual C++ 编译器的 __noop
也有。前者适用于 GCC 和 VC++ 编译器,而后者仅适用于 VC++。现在我们都知道,以上两条语句都将被视为无操作,不会生成相应的代码;但这是我有疑问的地方。
在 __noop
的情况下,MSDN 说它是编译器提供的内在函数。来到 (void) 0
~ 为什么编译器将它解释为无操作?它是 C 语言的一个棘手用法,还是标准明确说明了它?甚至这与编译器实现有关?
原文由 legends2k 发布,翻译遵循 CC BY-SA 4.0 许可协议
(void)0
(+;
) 是一个有效的,但“什么都不做”的 C++ 表达式,仅此而已。它不会转换为目标体系结构的no-op
指令,它只是一个空语句作为占位符,只要语言需要一个完整的语句(例如作为跳转标签的目标,或者在if
子句)。来自 Chris Lutz 的评论:
应该注意的是,当用作宏时(例如
#define noop ((void)0)
),(void)
防止它被意外用作值(如int x = noop;
)。对于上述表达式,编译器会正确地将其标记为无效操作。 GCC 吐出
error: void value not ignored as it ought to be
和 VC++ 吠声'void' illegal with all types
。