Есть ли эквивалент gcc -Wshadow в visual С++
- Wshadow будет "предупреждать, когда локальная переменная затеняет другую локальную переменную". Есть ли эквивалент в Visual С++ (2008)? Я попробовал /W 4, но он не понял. Я также попробовал Cppcheck, но это тоже не увидело.
например. если я непреднамеренно сделаю:
class A
{
private:
int memberVar;
public:
void fn()
{
int memberVar = 27;
}
};
Мне бы очень хотелось узнать об этом!
Ответы
Ответ 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.