【问题标题】:Is there an equivalent of gcc's -Wshadow in visual C++在视觉 C++ 中是否有相当于 gcc 的 -Wshadow
【发布时间】:2011-06-03 09:06:03
【问题描述】:

-Wshadow 将“每当一个局部变量隐藏另一个局部变量时发出警告。”。 Visual C++ (2008) 中是否有等价物?我试过 /W4 但它没有接受它。我也试过Cppcheck,但也没看到。

例如如果我不小心这样做了:

class A
{
        private:
                int memberVar;
        public:
                void fn()
                {
                        int memberVar = 27;
                }
};

我真的很想知道!

【问题讨论】:

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


【解决方案1】:

查看警告 C6244 和 C6246

但您需要启用自动代码分析才能获取它们,请参阅 How to: Enable and Disable Automatic Code Analysis for C/C++

如果你不能在你的 VS 版本 (Analyzing Managed Code Quality by Using Code Analysis) 中执行此操作,请尝试将 /analyze 标志添加到编译命令行。您将收到一些警告,表明您的 IDE 添加的 '/analyze-' 标志已被手动添加的 '/analyze' 标志替换,但分析将起作用 ;-)

【讨论】:

【解决方案2】:

恐怕没有。

您或许可以尝试使用 Clang 编译您的代码:

  • 它有这个警告(以及许多其他警告)
  • 它具有 MSVC 标头的兼容模式(并且可以构建大多数 MFC)

我们在工作中使用 gcc 来构建我们的代码,但定期使用 Clang 编译以测试代码是否符合标准并从其警告中受益。

【讨论】:

    【解决方案3】:

    没有关于 disabled by default 的警告,所以如果您没有看到默认级别的警告,我会说它无法完成。 (这是蹩脚的。)

    【讨论】:

      【解决方案4】:

      Visual Studio 2015 现在默认警告阴影变量。摘自http://blogs.msdn.com/b/vcblog/archive/2014/11/12/improvements-to-warnings-in-the-c-compiler.aspx 如下:

      阴影变量 如果封闭作用域已经包含同名变量,则变量声明会“遮蔽”另一个变量。例如:

      void f(int x) 
      { 
          int y;
          { 
              char x; //C4457
              char y; //C4456
          } 
      }
      

      x 的内部声明隐藏了函数 f 的参数,因此编译器将发出: 警告 C4457:“x”的声明隐藏了函数参数 y 的内部声明隐藏了函数范围内的 y 声明,因此编译器将发出: 警告 C4456:“y”的声明隐藏了以前的本地声明 请注意,和以前一样,与函数参数同名但未包含在内部范围内的变量声明会触发错误:

      void f(int x) 
      { 
          char x; //C2082
      }
      

      编译器发出: 错误 C2082:重新定义形参 'x'

      【讨论】:

        【解决方案5】:

        (我会将此作为对 Dawn 答案的评论,但目前声誉不足)

        在 Microsoft Connect 上打开了一个 issue,请求将警告从代码分析升级到标准编译。我建议对其进行投票以引起微软的注意。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        • 1970-01-01
        • 2010-11-19
        • 2013-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多