代码之家  ›  专栏  ›  技术社区  ›  SmacL

为什么下面的代码没有在MSVC中生成警告

  •  6
  • SmacL  · 技术社区  · 16 年前

    我有一段代码可以总结如下:;

    void MyFunc()
    {
       int x;
    '
    '
       x;  
    '
    '
    }
    

    我本以为只要引用一个变量,不管怎样都不修改它,或者不管怎样都不使用它的值,就会产生一个警告。在VS2003中两者都不起作用,我需要lint来拾取它。

    我意识到它不会影响执行,但既然它是一段不起任何作用的代码,而且程序员毫无疑问打算做一些事情,为什么不标记它呢?

    x=x

    修改后的问题,因为这是一个很好的警告候选者,但不是一个错误。答复表明,这是处理与其他编译器更好。稍后将试用VS2008并公布结果。

    4 回复  |  直到 16 年前
        1
  •  1
  •   anon anon    16 年前

    你需要使用一个更好的编译器:-用墙和迂回的标志编译,GCC C++编译器给出了这个代码:

    int main() {
        int x = 0;
        x;
    }
    

    ma.cpp:3: warning: statement has no effect
    
        2
  •  1
  •   Paul R    16 年前

    除非您将表达式转换为void,即。

    void MyFunc()
    {
       int x;
    
       (void)x;  
    
    }
    

    你设置了什么警戒级别?

        3
  •  1
  •   P Shved    16 年前

    出于元编程的目的,这样的代码可能出现在模板类中。例如,它可能是某种检查 x 可从当前上下文访问。 是的,它不影响测试结果 执行 ,但它确实会影响 汇编 ; 这可能有助于像 SFINAE

    看来,这对编译也没什么帮助。函数体对于为函数调用选择合适的模板不起作用。要检查类范围内的可访问性,必须使用 using 从属名称的运算符;这 使用

    所以,密码 x; 真的没有效果。

        4
  •  0
  •   Thomas Padron-McCarthy    16 年前

    )以及自我分配(例如 x=x 是C++中的有效代码,所以编译器不能将它们标记为错误,但是一个好的编译器当然可以发出警告,它们没有任何效果,可能是程序员的错误。例如,编译器g++为 .