我在glibc中看到过调试printfs,如果定义了NDEBUG,内部定义为(void) 0
.同样,Visual C++编译器的__noop
也是如此.前者适用于GCC和VC++编译器,后者仅适用于VC++.现在我们都知道,上述两条语句都将被视为无操作,并且不会生成相应的代码;但我有个疑问.
对于__noop
,MSDN说它是编译器提供的内部函数.到(void) 0
~为什么编译器会把它解释为无操作?这是C语言的一种棘手用法,还是该标准明确说明了这一点?或者甚至这与编译器实现有关?
我在glibc中看到过调试printfs,如果定义了NDEBUG,内部定义为(void) 0
.同样,Visual C++编译器的__noop
也是如此.前者适用于GCC和VC++编译器,后者仅适用于VC++.现在我们都知道,上述两条语句都将被视为无操作,并且不会生成相应的代码;但我有个疑问.
对于__noop
,MSDN说它是编译器提供的内部函数.到(void) 0
~为什么编译器会把它解释为无操作?这是C语言的一种棘手用法,还是该标准明确说明了这一点?或者甚至这与编译器实现有关?
(void)0
(+ ;
)是一个有效的,但"什么也不做"的C++表达式,就是一切.它不会转换为目标体系 struct 的no-op
指令,只要语言需要一个完整的语句(例如作为跳转标签的目标,或在if
子句的主体中),它就只是一个空语句作为占位符.
EDIT:(根据Chris Lutz的 comments 更新)
应该注意的是,当用作宏时
#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
.