21

我只是在研究 gcc 手册,有些事情我还不清楚:

  1. 指定标准时,我应该始终结合使用 -pedantic 吗?
  2. 使用-g 时,标准级别就足够了,还是我应该指定级别3,即-g3?
  3. 使用 -Werror 将所有警告提升为错误并使用 -pedantic-errors 将所有迂腐警告提升为错误是一种好习惯吗?
4

4 回答 4

29

如果您正在编写一个库,请确保使用一个简单的程序,例如

#include <yourlib.h>
int main() {
    return 0;
}

即使编译器在启用所有可选警告的最迂腐模式下运行,编译时也不会发出任何警告。

如果您正在编写一个应用程序,那么您的代码左右抛出警告只是您的应用程序的问题。但是,对于库的公共头文件,以后使用该库的每个人都将被迫忽略或忍受您的头文件引起的警告。

因此,如果可能的话,请检查您的库头文件是否在没有警告的情况下编译:

$ gcc -Wall -Wextra -Werror -std=c99   -pedantic
$ gcc -Wall -Wextra -Werror -std=gnu99 -pedantic
$ gcc -Wall -Wextra -Werror -std=c89   -pedantic
$ gcc -Wall -Wextra -Werror -std=gnu89 -pedantic

编译你的库会抛出多少警告再次只是你的问题。

于 2010-04-04T13:07:13.813 回答
9

所有这些都是意见问题和/或取决于您的代码库和编程实践。-Wall我总是用and编译-pedantic,我不在乎事情是被标记为错误还是警告,所以我从不使用-Werror,而且我很少使用调试器调试代码——只要我这样做-g就足够了。其他人可能会提出完全不同的答案。

于 2010-04-04T11:06:10.773 回答
8

这些都是非常主观的。以下是我的意见:

  1. 您的使用-pedantic不应与您对-std=foo. -pedantic如果您想要迂腐的错误消息,请使用;如果您正在使用-pedantic,您可能还需要-Walland -Wextra,因为您的目标通常是捕捉所有可能的失误,无论多么轻微。请注意,-pedantic不会捕获所有可能的警告,只会捕获 ISO C 标准需要诊断的警告。

  2. 我一直发现第 2 级(带有 的默认值-g)对于我的目的来说已经足够好了。第 3 级还包括有关程序中所有宏定义的信息,但这仅在您的调试器支持宏扩展时才有用;我的没有(GNU gdb 6.3.50-20050815(Apple 版本 gdb-696))。我不知道 3 级还包括哪些 2 级没有。

  3. 那要看。如果您的目标是制作最可移植、最符合标准的代码,那么是的,我强烈建议您始终使用-Werrorand -pedantic-error(与-Walland一起使用-Wextra),尤其是在开始新项目时。但是,如果您从大型代码库开始,打开这些选项可能会给您带来大量无害的虚假错误,特别是对于有符号/无符号不匹配和各种类型之间的隐式转换等问题。修复代码库以消除这些错误需要很长时间,所以我不推荐它。

    如果您正在做一个快速的一次性项目,请不要打扰,因为这些只会减慢您的速度。

    如果您正在开发一个库或将开源的东西,那么请打开这些。您的用户将非常感谢您的代码不会产生错误或警告这一事实。还要考虑ndim 的建议

于 2010-04-04T13:29:21.757 回答
3

我喜欢在 C++ 中使用 -Wall -Wextra。但是,如果 -Wextra 在我使用的库的标题上报告警告,我通常会放弃它。

于 2010-04-04T11:05:59.667 回答