Более детальное поведение опции gcc -Wshadow - PullRequest
7 голосов
/ 27 августа 2009

Ребята, мне действительно нравится опция -Wshadow, поскольку она помогает обнаружить некоторые возможные проблемные фрагменты кода. Я хочу использовать его в действительно большом проекте, но не могу, потому что он слишком строг. Например, он выдает предупреждение для следующего случая:

struct Foo
{
  Foo(int info) : info_(info) {} //shadow warning is here
  void info(){ ... }
  int info_;
};

gcc выдает предупреждение о затенении переменной "int info" в методе "void info", что ... ну, на самом деле, не очень полезное предупреждение для меня

Что меня действительно волнует, так это следующие случаи:

  int i = 0;
  for(int j=0;j<10;++j)
  {
    int i = j; //local scope variable "int i" shadows outer scope variable
    ++i;
  }

Можно ли заставить gcc предупреждать только об этих случаях?

Ответы [ 2 ]

10 голосов
/ 31 августа 2009

Для внешних библиотек вы можете попытаться указать их путь включения с помощью -isystem вместо -I, это приведет к тому, что gcc в большинстве случаев не будет выдавать предупреждения о них.

Когда предупреждение появляется только в нескольких ограниченных случаях, вы можете обойти его:

#pragma GCC diagnostic ignored "-Wshadow"

В остальных случаях единственными вариантами являются рефакторинг кода или выполнение трюка grep, упомянутого Питером.

3 голосов
/ 29 августа 2009

К сожалению, gcc не имеет возможности отключить предупреждения для определенных строк. В любом случае, если вы это делаете, вам просто нужно переименовать информационный параметр вашего конструктора в my_info, и тень исчезнет.

Лучший совет, который я могу вам дать, - поработать над удалением всех этих предупреждений, даже если вы не заботитесь о них. В общем случае лучше , чтобы не использовать имена параметров, которые скрывают функции-члены.

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

В некоторых случаях мы могли запустить скрипт над кодом, чтобы внести изменения для нас. Я не уверен, насколько это легко. В качестве альтернативы, хороший редактор (такой как emacs или VIM) должен помочь вам сделать этот тип «механического» изменения полуавтоматическим и довольно быстрым, если вы можете хорошо управлять редактором!

Еще один действительно хакерский вариант - создать список известных "нормальных" исключений и извлечь их из вывода компилятора. Вы можете создать оболочку для gcc, которая будет просто извлекать предупреждения, которые вы не хотите видеть. Я не рекомендую это, хотя, вероятно, будет легче исправить вашу кодовую базу!

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