伙计们,我非常喜欢-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
仅对这些案件发出警告?
答案 0 :(得分:10)
对于外部库,您可以尝试使用-isystem
而不是-I
指定其包含路径,这将导致gcc在大多数时间内停止在其中报告警告。
当警告仅在几个有限的情况下弹出时,您可以使用以下方法解决:
#pragma GCC diagnostic ignored "-Wshadow"
对于其余的案例,重构代码或执行grep
技巧彼得提到似乎是唯一的选择。
答案 1 :(得分:3)
可悲的是,gcc无法禁用特定行的警告。无论如何,如果你这样做,你应该只将你的构造函数的info参数重命名为my_info,阴影就会消失。
我能给你的最好建议就是去除所有这些警告,即使你不关心它们。通常, 更好,不使用隐藏成员函数的参数名称。
这是我们在启用新警告和引入其他静态检查程序时采用的方法。在我看来,痛苦总体上是值得的。
在某些情况下,我们可以在代码上运行脚本来为我们进行更改。我不确定那会有多容易。或者,一个好的编辑器(例如emacs或VIM)可以帮助你半自动地,相当快地进行那种“机械”改变,如果你能够很好地推动编辑的话!
另一个真正 hacky选项是创建已知“okay”异常的列表,并将它们从编译器输出中删除。您可以为gcc创建一个包装器,它只会提取您不希望看到的警告。我不推荐它,它可能更容易修复您的代码库!