Есть ли в Visual C ++ эквивалент gcc -Wshadow? - PullRequest
21 голосов
/ 03 июня 2011

-Wshadow будет «Предупреждать всякий раз, когда локальная переменная затеняет другую локальную переменную.».Есть ли эквивалент в Visual C ++ (2008)?Я попытался / W4, но он не подхватил его.Я также пытался Cppcheck , но он тоже этого не видел.

например, если бы я случайно сделал:

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

Я бы очень хотел узнать об этом!

Ответы [ 5 ]

9 голосов
/ 05 июня 2012

Ознакомьтесь с предупреждениями C6244 а также C6246

Но для их получения вам потребуется включить автоматический анализ кода, см. Как: включить и отключить автоматический анализ кода для C / C ++

Если вы не можете сделать это в своей редакции VS ( Анализ качества управляемого кода с помощью анализа кода ), попробуйте добавить флаг / analysis в командную строку компиляции. Вы получите несколько предупреждений о том, что флаг '/ analyse-', добавленный вашей IDE, заменен на флаг '/ analyse', добавленный вручную, но анализ будет работать; -)

7 голосов
/ 03 июня 2011

Боюсь, что нет.

Возможно, вы могли бы попробовать скомпилировать свой код с помощью Clang:

  • у него есть это предупреждение (и многие другие)
  • у него есть режим совместимости для заголовков MSVC (и он может создавать большую часть MFC)

Мы используем gcc на работе, чтобы построить наш код, но регулярно компилируем с Clang для проверки соответствия кода стандарту иизвлекать выгоду из своих предупреждений.

4 голосов
/ 29 июля 2015

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'

4 голосов
/ 03 июня 2011

Нет предупреждения об этом, которое отключено по умолчанию , поэтому, если вы не видите предупреждение на уровнях по умолчанию, я бы сказал, что это невозможно сделать.(Который хромает.)

1 голос
/ 11 марта 2014

(я бы добавил это как комментарий к ответу Дауна, но на данный момент у меня недостаточно репутации)

Существует проблема , открытая в петиции Microsoft Connect для обновления предупреждения с анализа кода до стандартной компиляции. Я предлагаю отказаться от голосования, чтобы попытаться привлечь внимание Microsoft.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...