Подтвердить что ты не робот

Есть ли эквивалент gcc -Wshadow в visual С++

- Wshadow будет "предупреждать, когда локальная переменная затеняет другую локальную переменную". Есть ли эквивалент в Visual С++ (2008)? Я попробовал /W 4, но он не понял. Я также попробовал Cppcheck, но это тоже не увидело.

например. если я непреднамеренно сделаю:

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

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

4b9b3361

Ответ 1

Я боюсь, что нет.

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 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, но на данный момент у вас недостаточно репутации)

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