【发布时间】:2011-01-13 00:37:33
【问题描述】:
我在 glibc 中看到了 debug printfs,如果 NDEBUG 被定义,则内部定义为 (void) 0。同样,Visual C++ 编译器的__noop 也在那里。前者适用于 GCC 和 VC++ 编译器,而后者仅适用于 VC++。现在我们都知道,以上两条语句都将被视为无操作,不会生成相应的代码;但这是我有疑问的地方。
对于__noop,MSDN 表示它是编译器提供的内在函数。来到(void) 0 〜为什么编译器将其解释为无操作?它是 C 语言的一个棘手用法,还是标准明确说明了它?甚至这与编译器实现有关?
【问题讨论】:
-
通过仅给出
0;作为声明,我不会收到警告或错误,并且我确信它不会执行任何有效操作并且等于无操作;即使是这样,为什么要将其强制转换为 void?另外,如果是#define dbgprintf (void) 0,当它被称为dbgprintf("Hello World!");->(void) 0("Hello World!");- 这是什么意思? -
这应该是
#define dbgprintf(x) (void)0;虽然我发现#define dbgprintf(x)完全足够了。我认为强制转换为 void 是为了删除任何返回值,因此如果在需要值(并且不应该)的上下文中使用它,它将导致错误/警告,而不是静默传递。 -
是的,我没有注意到 #define 忽略参数 (x) 只是做了一个
(void) 0。感谢您指出:) -
好吧,假设你是一个编译器。你会为这个语句生成什么代码:
(void) 0;?现在你知道了。 -
为什么不使用
#define dbgprintf而不是#define dbgprintf ((void) 0)??? @legends2k 有原因吗?
标签: c++ c compiler-construction language-details