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

我想知道哪个是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的函数的问题,或者将signed和unsigned int之间的比较并且这会导致旧的编译器扼杀它。

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


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

但通常我从来没有看到任何新的gcc会接受的,并被无效的旧gcc拒绝。 我怀疑任何这样的问题是旧版编译器或标准库中的一个错误。 海湾合作委员会没有提供正确的警告,但不适用于旧版本,因此除了使用旧版本测试外,没有其他选择。

至于你提到的具体问题:

  • 将double传递给期望int的函数不是错误。 这可能是未定义的行为。 -Wconversion应该有所帮助。
  • 比较signed和unsigned也是很好的定义,并且总是按照定义进行工作,并且在相等比较的情况下实际上会使程序员编写更糟糕的代码(将大于int的无符号变量与-1进行比较,而不是将其与-1u进行比较)。 所以我实际上总是用-Wno-sign-compare编译。
  • 编译器不应该打印在用-isystem而不是-I给出的目录中找到的头文件的警告,所以应该让你沉默Qt头文件的警告并保持它为你自己的代码启用。 所以你应该可以使用-Wconversion


    除了编译器之外,请使用lint或其他静态分析工具来检查代码。 在我的Linux发行版中, apt-get install splint将得到splint,也许检查是否为您的操作系统打包了易于安装。

    链接地址: http://www.djcxy.com/p/68891.html

    上一篇: Being extremely pedantic with the way your code is compiled

    下一篇: Rails Routes With Query Parameters