gpt4 book ai didi

c++ - 为什么 (void) 0 在 C 和 C++ 中是无操作?

转载 作者:IT老高 更新时间:2023-10-28 13:58:18 24 4
gpt4 key购买 nike

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

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

最佳答案

(void)0 (+;) 是有效的,但“无所作为”的 C++ 表达式,仅此而已。它不会转换为目标体系结构的 no-op 指令,它只是一个空语句作为占位符,只要语言需要一个完整的语句(例如作为跳转标签的目标,或者在if 子句的主体)。

来自 Chris Lutz's comment :

需要注意的是,当用作宏时(例如,#define noop ((void)0)),(void) 会阻止它被不小心用作值(如在 int x = noop; 中)。

对于上述表达式,编译器会正确地将其标记为无效操作。 GCC 吐出 error: void value not ignored as it should be 和 VC++ 吠叫 'void' 对所有类型都是非法的

关于c++ - 为什么 (void) 0 在 C 和 C++ 中是无操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2198950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com