我今天在 if 中遇到了这个问题,经过研究发现所有这些都是生成 C4353 的有效语句。 我唯一的猜测是这是在 C 中执行 noop 的旧方法。为什么这不是一个错误。 你什么时候会用它来做任何有用的事情。
int main()
{
nullptr();
0();
(1 == 2)();
return 0;
}
使用常量 0 作为函数表达式是 Microsoft 特有的扩展。他们专门实施了这一点,因为他们看到了这样做的原因,这解释了为什么将其视为错误是没有意义的。但由于它是非标准的,编译器会发出警告。
你是对的,它是使用 __noop() 的替代方法。
所有这些:
nullptr();
0();
(1 == 2)();
是无操作语句(意味着它们不执行任何操作)。
顺便说一句,我希望您不要忽视警告。大多数时候,修复所有警告是一个很好的做法。
如 C4353 警告页面 和
__noop
内部文档中所述,使用 0
作为函数表达式指示 Microsoft C++ 编译器忽略对该函数的调用,但仍生成计算其参数的代码(针对副作用)。
给出的示例是一个跟踪宏,它将
#defined
获取到 __noop
或打印函数,具体取决于 DEBUG
预处理器符号的值:
#if DEBUG
#define PRINT printf_s
#else
#define PRINT __noop
#endif
int main() {
PRINT("\nhello\n");
}
该警告的 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();
}
如您所见,它是为了支持古老的宏用法。