c++ - 对代码的编译方式非常迂腐

标签 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

但这种组合无法识别问题,例如将 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/

相关文章:

excel - VBA在特定的工作表中搜索错误,然后将结果传递回主宏

algorithm - 使用什么算法来计算校验位?

c++ - 为什么是 BGRA 而不是 RGBA?

c++ - 在运行子类方法的基类中创建线程

c++ - 按大写字母顺序排列字符串 C++

c++ - #ifdef标志来说明gcc和g++编译器之间的区别?

excel - 如何在 EPPlus 中关闭 Excel 应用程序对象的后台错误检查?

c++ - 计数 __VA_ARGS__ MSVC 给出意想不到的结果

c++ - 动态子对象内存分配 Clang++ vc g++

c++ - ISO C++ 禁止声明没有类型的 ‘tuple’