我想找出哪个是 g++ (4.7) 最极端的错误检查标志组合。我们没有使用新的 C++11 规范,因为我们需要使用旧编译器交叉编译代码,而这些旧编译器(主要是 g++ 4.0)经常会导致 g++4.7 忽略的问题。
现在我们使用以下一组标志:
-Wall -Wcomment -Wformat -Winit-self -ansi -pedantic-errors \
-Wno-long-long -Wmissing-include-dirs -Werror -Wextra
但这种组合无法识别问题,例如将 double 传递给需要 int 的函数,或比较有符号和无符号 int,这会导致旧编译器在其上阻塞。
我已经通读了文档,-Wsign-compare
应该由 -Wextra
启用,但实际上情况似乎并非如此,所以我可能错过了一些东西...
最佳答案
-ansi
是没有 GNU 扩展的默认标准的别名。我建议改为显式使用 -std=c++98
,但它应该是 g++ -ansi
的默认设置,所以并没有太大区别。
但一般来说,我从未见过任何会被较新的 gcc 接受并被较旧的 gcc 以无效为由拒绝的东西。我怀疑任何此类问题都是旧编译器或其标准库中的错误。 Gcc 没有针对正确内容的警告,但不适用于旧版本,因此除了使用旧版本进行测试外,您别无选择。
关于您提到的具体问题:
- 将 double 传递给需要 int 的函数不是错误。虽然它可能是未定义的行为。
-Wconversion
应该有帮助。 - signed 与 unsigned 的比较也有很好的定义,也总是按定义工作,在相等比较的情况下实际上会使程序员编写更糟糕的代码(将大于 int 的 unsigned 变量与 -1 进行比较是另一回事将其与 -1u 进行比较)。所以我实际上总是使用
-Wno-sign-compare
进行编译。
编译器不应该为在用 -isystem
而不是 -I
给定的目录中找到的头文件打印警告,这样你就可以让 Qt 头文件的警告静音并保持它为您自己的代码启用。所以你应该能够使用-Wconversion
。
关于c++ - 对代码的编译方式非常迂腐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14578969/