vs2010 C4353为什么不是这个错误

时间:2011-10-21 19:54:29

标签: c++ c compiler-construction compiler-warnings

我今天遇到了这个问题,在查看之后发现所有这些都是生成C4353的有效语句。我唯一的猜测是,这是在C中做noop的旧方式。为什么这不是错误。你什么时候用它来做任何有用的事情。

int main()
{
    nullptr();
    0();
    (1 == 2)();
    return 0;

}

4 个答案:

答案 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();
}

正如您所看到的那样,它支持古老的宏用法。