在GCC中编译时使用`-Wextra`标志的缺点

Spi*_*rix 8 c gcc code-analysis compiler-flags compiler-warnings

我知道应该总是用两者编译-Wall并且-Wextra因为它们启用警告并帮助我们理解我们的错误,如果有的话.

我已经读过-Wextra不建议使用编译器标志,因为它太冗长了很多误报.

读这篇文章我很惊讶.所以我开始谷歌搜索它,但我没有得到任何答案,因为所有搜索结果显示" -Wextra旗帜做什么?".

所以,我的问题是

  • 在哪种情况下,-Wextra旗帜会发出不必要的警告?
  • 是否可以阻止该-Wextra标志启用导致GCC发出这些类型警告的其他标志?

cma*_*ter 8

关于-Wextra警告有用性的观点是相应的警告具有这些属性(或多或少):

  1. 他们产生误报.

  2. 误报是相对频繁的.

  3. 调整代码以避免误报是令人讨厌的.

结果是,许多打开的项目-Wall -Wextra放弃了试图避免所有警告.因此,当您编译这样的项目时,您会看到成百上千的警告,几乎所有关于合法代码的警告.你应该看到的一个警告,在无尽的警告流中没有注意到.更糟糕的是:正常编译会发出如此多的警告这一事实使您对避免新代码引入的新警告感到邋..一旦项目达到几十个警告,战斗通常结束; 它需要英勇的努力才能将警告计数恢复为零.

以下是一些完全合法的代码示例-Wextra:

void myClass_destruct(MyClass* me) {}
Run Code Online (Sandbox Code Playgroud)

它是一个析构函数,它是空的.然而,它应该只是为了方便在适当的点(子类析构函数)调用它,因此很容易添加MyClass需要清理的东西.但是,-Wextra会在未使用的me参数上吠叫.这迫使程序员编写如下代码:

void myClass_destruct(MyClass* me) {
    (void)me;    //shut up the compiler barking about the unused parameter
}
Run Code Online (Sandbox Code Playgroud)

这是明显的噪音.写这样的代码会很烦人.但是,为了在一种-Wextra制度下实现零警告计数,需要将这种噪声添加到代码中.所以,你可以选择这三个中的任何两个:

  1. 清洁代码

  2. 零警告计数

  3. -Wextra 警告

明智地选择你要放弃哪一个,你不会得到这三个.

  • 您可以通过编写`myClass_destruct(MyClass*)`或`myClass_destruct(MyClass*/*me*/)`来修复未使用的参数警告.对我来说,它们看起来都不像是"普通噪音",并且当故意不使用参数时,两者都清楚地说明了这一点. (3认同)