我在glibc中看到了debug printfs (void) 0,如果定义了NDEBUG,则内部定义为.同样__noop,Visual C++编译器也是如此.前者适用于GCC和VC++编译器,而后者仅适用于VC++.现在我们都知道上述两个语句都将被视为无操作,并且不会生成相应的代码; 但这是我怀疑的地方.
在这种情况下__noop,MSDN说它是编译器提供的内部函数.来(void) 0〜为什么编译器将其解释为没有操作?这是C语言的一个棘手的用法还是标准说明了它的明确性?或者甚至那与编译器实现有关?
在我使用的一个库中,我看到了这段代码:
template<typename T>
void f(SomeTemplatedClass<T> input)
{
(void)input;
...
use(input); // code that uses input
}
Run Code Online (Sandbox Code Playgroud)
我不知道这段代码的含义是什么.如果我将演员阵容移除为无效,我会得到一个
statement has no effect
Run Code Online (Sandbox Code Playgroud)
gcc中的警告.所以我想有人故意这样做,故意添加演员以摆脱警告.
您是否对任何无效的陈述有任何经验,但由于某种原因需要它?
编辑:
假设这与模板无关,这是安全的吗?例如绕过旧的编译器错误等?