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

hel*_*hod 17 gcc warnings debug-symbols

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

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

ndi*_*dim 24

如果你正在写一个库,请不要确保一个简单的程序一样

#include <yourlib.h>
int main() {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

即使编译器在最迂腐模式下运行并且启用了所有可选警告,编译也没有任何警告.

如果您正在编写应用程序,则代码向左和向右抛出警告只是您的应用程序的问题.但是,对于库的公共头文件,后来使用该库的每个人都将被迫忽略或忍受代码导致的警告.

因此,请检查您的库头是否在没有警告的情况下编译,如果可能,请在多种编译器模式

$ 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
Run Code Online (Sandbox Code Playgroud)

  • 一些C99代码不是有效的C89代码 - 这不会使代码变坏.只有在这种可移植性实际上是项目的既定目标时,才需要两者之间的可移植性. (6认同)
  • 那么你编译头文件而不编译实现?我看不出那给你的东西.如果我明确地说我的库是C99,那为什么它应该与C89兼容呢?为什么K&R不兼容呢? (2认同)
  • 同样在64位模式下构建的concider(** - m64**用于**gcc**) - 可能会显示更多警告:) (2认同)

小智 8

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


Ada*_*eld 7

这些都是高度主观的.以下是我的意见:

  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-Wextra),特别是在开始新项目时.但是,如果您从大型代码库开始,打开这些选项可能会给您带来大量无害,虚假的错误,特别是对于签名/无符号不匹配以及各种类型之间的隐式转换.您需要花费很长时间来修复代码库以消除这些错误,因此我不建议您这样做.

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

    如果您正在使用图书馆或某些可以开源的东西,那么请打开它们.您的用户将非常感谢您的代码不会产生错误或警告.同时考虑ndim的建议.