对代码编译的方式非常迂腐
我想知道哪个是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拒绝。 我怀疑任何这样的问题是旧版编译器或标准库中的一个错误。 海湾合作委员会没有提供正确的警告,但不适用于旧版本,因此除了使用旧版本测试外,没有其他选择。
至于你提到的具体问题:
-Wconversion
应该有所帮助。 -Wno-sign-compare
编译。 编译器不应该打印在用-isystem
而不是-I
给出的目录中找到的头文件的警告,所以应该让你沉默Qt头文件的警告并保持它为你自己的代码启用。 所以你应该可以使用-Wconversion
。
除了编译器之外,请使用lint或其他静态分析工具来检查代码。 在我的Linux发行版中, apt-get install splint
将得到splint,也许检查是否为您的操作系统打包了易于安装。
上一篇: Being extremely pedantic with the way your code is compiled