gcc -Wshadow选项的更细粒度的行为

时间:2009-08-27 07:25:51

标签: c gcc

伙计们,我非常喜欢-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 个答案:

答案 0 :(得分:10)

对于外部库,您可以尝试使用-isystem而不是-I指定其包含路径,这将导致gcc在大多数时间内停止在其中报告警告。

当警告仅在几个有限的情况下弹出时,您可以使用以下方法解决:

#pragma GCC diagnostic ignored "-Wshadow"

对于其余的案例,重构代码或执行grep技巧彼得提到似乎是唯一的选择。

答案 1 :(得分:3)

可悲的是,gcc无法禁用特定行的警告。无论如何,如果你这样做,你应该只将你的构造函数的info参数重命名为my_info,阴影就会消失。

我能给你的最好建议就是去除所有这些警告,即使你不关心它们。通常, 更好,不使用隐藏成员函数的参数名称。

这是我们在启用新警告和引入其他静态检查程序时采用的方法。在我看来,痛苦总体上是值得的。

在某些情况下,我们可以在代码上运行脚本来为我们进行更改。我不确定那会有多容易。或者,一个好的编辑器(例如emacs或VIM)可以帮助你半自动地,相当快地进行那种“机械”改变,如果你能够很好地推动编辑的话!

另一个真正 hacky选项是创建已知“okay”异常的列表,并将它们从编译器输出中删除。您可以为gcc创建一个包装器,它只会提取您不希望看到的警告。我不推荐它,它可能更容易修复您的代码库!