为什么 (void) 0 在 C 和 C 中没有操作?

新手上路,请多包涵

我已经在 glibc 中看到了调试 printfs,如果定义了 NDEBUG ,则内部定义为 (void) 0 。同样,Visual C++ 编译器的 __noop 也有。前者适用于 GCC 和 VC++ 编译器,而后者仅适用于 VC++。现在我们都知道,以上两条语句都将被视为无操作,不会生成相应的代码;但这是我有疑问的地方。

__noop 的情况下,MSDN 说它是编译器提供的内在函数。来到 (void) 0 ~ 为什么编译器将它解释为无操作?它是 C 语言的一个棘手用法,还是标准明确说明了它?甚至这与编译器实现有关?

原文由 legends2k 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 731
1 个回答

(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

原文由 Alexander Gessler 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题