在Visual C++中是否有相当于gcc的-Wshadow

dan*_*nio 21 c++ compiler-warnings visual-c++

-Wshadow将"当局部变量影响另一个局部变量时发出警告." Visual C++(2008)中是否存在等价物?我试过/ W4但它没有接受它.我也试过Cppcheck,但也没看到.

例如,如果我无意中做了:

class A
{
        private:
                int memberVar;
        public:
                void fn()
                {
                        int memberVar = 27;
                }
};
Run Code Online (Sandbox Code Playgroud)

我真的很想知道它!

dwn*_*dwn 9

查看警告 C6244C6246

但是您需要启用自动代码分析才能获取它们,请参阅 如何:启用和禁用C/C++的自动代码分析

如果在VS版本中无法执行此操作(使用代码分析分析托管代码质量),请尝试将/ analyze标志添加到编译命令行.您将收到一些警告,表示IDE已添加的'/ analyze-'标志被替换为手动添加的'/ analyze'标志,但分析将起作用;-)


Mat*_* M. 7

我不敢.

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

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

我们在工作中使用gcc来构建我们的代码,但是定期与Clang一起编译以测试代码与标准的一致性并从其警告中受益.


fsc*_*itt 5

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
    } 
}
Run Code Online (Sandbox Code Playgroud)

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

void f(int x) 
{ 
    char x; //C2082
}
Run Code Online (Sandbox Code Playgroud)

编译器发出:错误 C2082:形式参数“x”的重新定义