Gcc -Wextra它到底有多有用?

Gcc -Wextra它到底有多有用?,gcc,Gcc,我正在阅读gcc手册,尤其是关于警告/错误标志的部分。在阅读了关于-Wextra标志的部分之后,我想知道它是否有用。它似乎在抱怨那些似乎相当主观的事情,或者说是一种品味问题。我对gcc没有太多的经验,我只是在大学的一些小项目中不时使用它,所以对于所有有经验的C/C++(或者对于使用gcc的任何语言),Wextra是怎么回事?,以及其他东西意味着: 如果比较始终为true或true,则发出警告 由于范围有限,始终为false 数据类型的,但不警告 常量表达式。例如 如果未使用无符号变量,则发出警告

我正在阅读gcc手册,尤其是关于警告/错误标志的部分。在阅读了关于-Wextra标志的部分之后,我想知道它是否有用。它似乎在抱怨那些似乎相当主观的事情,或者说是一种品味问题。我对gcc没有太多的经验,我只是在大学的一些小项目中不时使用它,所以对于所有有经验的C/C++(或者对于使用gcc的任何语言),Wextra是怎么回事?

以及其他东西意味着:

如果比较始终为true或true,则发出警告 由于范围有限,始终为false 数据类型的,但不警告 常量表达式。例如 如果未使用无符号变量,则发出警告 与带“=”的零进行比较。此警告也由启用 -韦斯特拉


我发现这真的很有用。

我通常添加
-Wno符号比较
-Wno未使用的参数
,以消除噪声

隐含的
-Wuninitialized
(使用
-O2
选项)对我非常有帮助,但最初将其添加到代码库可能会有点让人望而生畏。解决这个问题的一种方法是添加两个宏(看起来有点奇怪:等号是故意的):

然后,您可以使用以下方法快速消除gcc警告并获得干净的编译:

int foo UNCHECKED_GCC_WARNING;
然后作为可选步骤,返回并检查这些添加,并逐个更改它们以消除警告。这可能很慢。但如果您没有发现一些现有的bug,我会感到惊讶。

请查看


因此,它不仅适用于“始终为真”的比较(-Wsign compare),而且还可以识别其他编译问题。我发现它经常很有用。

我发现
-Wno unused parameter
非常有用,尤其是当旧的源代码随着时间的推移而改变时,有时值会被传递到甚至没有使用的嵌套函数中。建议定义未使用的<代码>#定义未使用(x)未使用###x(uu未使用)属性u((u未使用)))然后可以像这样包装参数<代码>void func(int a,int UNUSED(b)){…}如果以后需要在GCC上使用参数,那么在不删除UNUSED()属性的情况下,GCC不会让这种情况发生。谢谢,这是一条有用的建议,但我个人不会禁用-Wsign compare,除非代码库中有太多的参数需要处理。因为比较有符号和无符号可能会产生许多错误,除非您确定int永远不会为负,uint永远不会大于MAX_INTideasman42,否则您也可以在函数体中使用“(void)paramName;”来抑制警告,而不是使用attributes,但它也可能导致恼人的误报,例如,当需要在其他平台上进行比较时。除了使用预处理器条件隐藏比较之外,似乎没有办法禁止此警告,这有点难看。
int foo UNCHECKED_GCC_WARNING;