我今天遇到了这个问题,在查看之后发现所有这些都是生成C4353的有效语句。我唯一的猜测是,这是在C中做noop的旧方式。为什么这不是错误。你什么时候用它来做任何有用的事情。
int main()
{
nullptr();
0();
(1 == 2)();
return 0;
}
答案 0 :(得分:3)
将常量0用作函数表达式是特定于Microsoft的扩展。他们专门实现了这一点,因为他们看到了它的原因,这解释了为什么将它视为错误是没有意义的。但由于它是非标准的,编译器会发出警告。
你是对的,它是使用__noop()的替代方法。
答案 1 :(得分:1)
所有这些:
nullptr();
0();
(1 == 2)();
是无操作语句(意味着它们不做任何事情)。
顺便说一句,我希望你不要忽视警告。大多数情况下,修复所有警告是一种很好的做法。
答案 2 :(得分:1)
如C4353 warning page和__noop
intrinsic documentation中所述,使用0
作为函数表达式指示Microsoft C ++编译器忽略对函数的调用但仍生成用于评估的代码它的论点(副作用)。
给出的示例是一个跟踪宏,它将#defined
传递给__noop
或打印函数,具体取决于DEBUG
预处理程序符号的值:
#if DEBUG
#define PRINT printf_s
#else
#define PRINT __noop
#endif
int main() {
PRINT("\nhello\n");
}
答案 3 :(得分:0)
该警告的MSDN page有充分的解释和激励示例:
// C4353.cpp
// compile with: /W1
void MyPrintf(void){};
#define X 0
#if X
#define DBPRINT MyPrint
#else
#define DBPRINT 0 // C4353 expected
#endif
int main(){
DBPRINT();
}
正如您所看到的那样,它支持古老的宏用法。