vs2010 C4353 为什么这不是一个错误

问题描述 投票:0回答:4

我今天在 if 中遇到了这个问题,经过研究发现所有这些都是生成 C4353 的有效语句。 我唯一的猜测是这是在 C 中执行 noop 的旧方法。为什么这不是一个错误。 你什么时候会用它来做任何有用的事情。

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

}
c++ c visual-studio-2010 compiler-warnings
4个回答
3
投票

使用常量 0 作为函数表达式是 Microsoft 特有的扩展。他们专门实施了这一点,因为他们看到了这样做的原因,这解释了为什么将其视为错误是没有意义的。但由于它是非标准的,编译器会发出警告。

你是对的,它是使用 __noop() 的替代方法。


1
投票

所有这些:

    nullptr();
    0();
    (1 == 2)();

是无操作语句(意味着它们不执行任何操作)。

顺便说一句,我希望您不要忽视警告。大多数时候,修复所有警告是一个很好的做法。


1
投票

C4353 警告页面

__noop
内部文档中所述,使用
0
作为函数表达式指示 Microsoft C++ 编译器忽略对该函数的调用,但仍生成计算其参数的代码(针对副作用)。

给出的示例是一个跟踪宏,它将

#defined
获取到
__noop
或打印函数,具体取决于
DEBUG
预处理器符号的值:

#if DEBUG
   #define PRINT   printf_s
#else
   #define PRINT   __noop
#endif

int main() {
   PRINT("\nhello\n");
}

0
投票

该警告的 MSDN 页面 有充分的解释和激励示例:

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

如您所见,它是为了支持古老的宏用法。

© www.soinside.com 2019 - 2024. All rights reserved.