编写代码的方式非常迂腐

Fer*_*eak 7 c++ g++ error-checking

我想找出哪个是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
Run Code Online (Sandbox Code Playgroud)

但是这个组合并不能识别诸如将double传递给期望int的函数或者signed和unsigned int之间的比较之类的问题,这会导致旧编译器阻塞它.

我已经阅读了文档,-Wsign-compare应该启用-Wextra但实际上似乎并非如此,所以我可能错过了一些东西......

Jan*_*dec 3

-ansi不带 GNU 扩展的默认标准的别名。我建议改为显式使用-std=c++98,但它应该是默认的g++ -ansi,所以没有什么不同。

但一般来说,我从未见过任何会被较新的海湾合作委员会接受并被较旧的海湾合作委员会以无效为由拒绝的东西。我怀疑任何此类问题都是旧编译器或其标准库中的错误。Gcc 不会对正确的内容发出警告,但不适用于旧版本,因此除了使用旧版本进行测试之外,您没有任何其他选择。

至于你提到的具体问题:

  • 将 double 传递给需要 int 的函数不是错误。但这可能是未定义的行为。-Wconversion应该有帮助。
  • 比较有符号与无符号也是明确定义的,也总是按定义工作,并且在相等比较的情况下实际上会使程序员编写更糟糕的代码(将大于 int 的无符号变量与 -1 进行比较与将其与 -1u 进行比较不同)。所以我实际上总是使用-Wno-sign-compare.

编译器不应打印在给定的目录中找到的标头的警告,-isystem而不是-I,这样您就可以静默 Qt 标头的警告,并为您自己的代码启用它。所以你应该能够使用-Wconversion.