gcc:使用-Werror和-pedantic被认为是好习惯吗?

时间:2010-04-04 10:58:35

标签: gcc warnings debug-symbols

我正在深入研究gcc手册,有些事情我还不清楚:

  1. 指定std时,我是否应该始终使用-pedantic?
  2. 使用-g时,标准级别是否足够,或者我应指定级别3,即 -g3?
  3. 使用-Werror来提升所有错误警告和-pedantic-errors以促使所有迂腐警告错误是一种好习惯吗?

4 个答案:

答案 0 :(得分:21)

如果你正在写一个图书馆,请确保像

这样的简单程序
#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

答案 1 :(得分:8)

所有这些都是意见问题和/或取决于您的代码库和编程实践。我总是使用-Wall-pedantic进行编译,我不关心事情是否被标记为错误或警告,因此我从不使用-Werror,并且我很少使用调试器调试代码 - 当我这样做时,-g就足够了。其他人可能会提出完全不同的答案。

答案 2 :(得分:6)

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

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

  2. 我总是发现级别2(默认为-g)足以满足我的目的。级别3还包括有关程序中所有宏定义的信息,但这仅在调试器支持宏扩展时才有用。我没有(GNU gdb 6.3.50-20050815(Apple版gdb-696))。我不知道3级还包括哪个级别2没有。

  3. 这取决于。如果您的目标是制作最便携,最符合标准的代码,那么是的,我强烈建议您始终使用-Werror-pedantic-error(以及-Wall和{{1} }),特别是在开始新项目时。但是,如果您从大型代码库开始,打开这些选项可能会给您带来大量无害,虚假的错误,特别是对于签名/无符号不匹配以及各种类型之间的隐式转换。您需要花费很长时间来修复代码库以消除这些错误,因此我不推荐它。

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

    如果您正在使用图书馆或某些可以开源的图书馆,那么请打开它们。您的用户将非常感谢您的代码不会产生错误或警告。另请考虑ndim's advice

答案 3 :(得分:3)

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