我只是在研究 gcc 手册,有些事情我还不清楚:
- 指定标准时,我应该始终结合使用 -pedantic 吗?
- 使用-g 时,标准级别就足够了,还是我应该指定级别3,即-g3?
- 使用 -Werror 将所有警告提升为错误并使用 -pedantic-errors 将所有迂腐警告提升为错误是一种好习惯吗?
我只是在研究 gcc 手册,有些事情我还不清楚:
如果您正在编写一个库,请确保使用一个简单的程序,例如
#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
编译你的库会抛出多少警告再次只是你的问题。
所有这些都是意见问题和/或取决于您的代码库和编程实践。-Wall
我总是用and编译-pedantic
,我不在乎事情是被标记为错误还是警告,所以我从不使用-Werror
,而且我很少使用调试器调试代码——只要我这样做-g
就足够了。其他人可能会提出完全不同的答案。
这些都是非常主观的。以下是我的意见:
您的使用-pedantic
不应与您对-std=foo
. -pedantic
如果您想要迂腐的错误消息,请使用;如果您正在使用-pedantic
,您可能还需要-Wall
and -Wextra
,因为您的目标通常是捕捉所有可能的失误,无论多么轻微。请注意,-pedantic
不会捕获所有可能的警告,只会捕获 ISO C 标准需要诊断的警告。
我一直发现第 2 级(带有 的默认值-g
)对于我的目的来说已经足够好了。第 3 级还包括有关程序中所有宏定义的信息,但这仅在您的调试器支持宏扩展时才有用;我的没有(GNU gdb 6.3.50-20050815(Apple 版本 gdb-696))。我不知道 3 级还包括哪些 2 级没有。
那要看。如果您的目标是制作最可移植、最符合标准的代码,那么是的,我强烈建议您始终使用-Werror
and -pedantic-error
(与-Wall
and一起使用-Wextra
),尤其是在开始新项目时。但是,如果您从大型代码库开始,打开这些选项可能会给您带来大量无害的虚假错误,特别是对于有符号/无符号不匹配和各种类型之间的隐式转换等问题。修复代码库以消除这些错误需要很长时间,所以我不推荐它。
如果您正在做一个快速的一次性项目,请不要打扰,因为这些只会减慢您的速度。
如果您正在开发一个库或将开源的东西,那么请打开这些。您的用户将非常感谢您的代码不会产生错误或警告这一事实。还要考虑ndim 的建议。
我喜欢在 C++ 中使用 -Wall -Wextra。但是,如果 -Wextra 在我使用的库的标题上报告警告,我通常会放弃它。