我正在深入研究gcc手册,有些事情我还不清楚:
答案 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)
这些都是非常主观的。以下是我的意见:
您对-pedantic
的使用不应与-std=foo
的使用挂钩。如果您想要迂腐错误消息,请使用-pedantic
;如果您使用-pedantic
,则可能还需要-Wall
和-Wextra
,因为您的目标通常是捕捉所有可能的失误,无论多么轻微。请注意,-pedantic
不会捕获所有可能的警告,只会发出ISO C标准要求诊断的警告。
我总是发现级别2(默认为-g
)足以满足我的目的。级别3还包括有关程序中所有宏定义的信息,但这仅在调试器支持宏扩展时才有用。我没有(GNU gdb 6.3.50-20050815(Apple版gdb-696))。我不知道3级还包括哪个级别2没有。
这取决于。如果您的目标是制作最便携,最符合标准的代码,那么是的,我强烈建议您始终使用-Werror
和-pedantic-error
(以及-Wall
和{{1} }),特别是在开始新项目时。但是,如果您从大型代码库开始,打开这些选项可能会给您带来大量无害,虚假的错误,特别是对于签名/无符号不匹配以及各种类型之间的隐式转换。您需要花费很长时间来修复代码库以消除这些错误,因此我不推荐它。
如果你正在做一个快速一次性的项目,不要打扰,因为这些只会减慢你的速度。
如果您正在使用图书馆或某些可以开源的图书馆,那么请打开它们。您的用户将非常感谢您的代码不会产生错误或警告。另请考虑ndim's advice。
答案 3 :(得分:3)
我喜欢使用-Wall -Wextra for C ++。但是,如果-Wextra报告我使用的库的标题上的警告,我通常会删除它。