【问题标题】:vs2010 C4353 why isn't this an errorvs2010 C4353 为什么这不是错误
【发布时间】:2011-10-21 19:54:28
【问题描述】:

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

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

}

【问题讨论】:

  • GCC-4.3.4 问题errors for all three,这几乎告诉我们VC2010支持这些作为编译器扩展。
  • “所有这些都是有效的陈述”是什么意思?除了无法编译此代码的 Visual C++ 10.0 之外,我还知道至少还有一个编译器。 p.s. vs2010 不是编译器的名称,您是在说“我从 Vim 编译这段代码”... :-)
  • 棘手的部分是如果你有一个 if 像 a == nullptr (x =y) 这就是我所拥有的。有人忘记了 &&,它根本不像你想的那样。
  • @mloskot 谢谢你的迂腐错误。正确的版本是 Microsoft (R) C/C++ Optimizing Compiler Version 16.00.30319.01 for x64
  • @rerun 不错。尝试使用 /Za 开关编译并比较结果。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    所有这些:

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

    是无操作语句(意味着它们不做任何事情)。

    顺便说一句,我希望你不要忽视警告。大多数情况下,修复所有警告是一个好习惯。

    【讨论】:

      【解决方案3】:

      正如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");
      }
      

      【讨论】:

        【解决方案4】:

        该警告的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();
        }
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-05
          • 2018-08-18
          • 1970-01-01
          • 2014-01-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多