我想找出哪个是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
启用,但在实践中似乎并非如此,所以我可能错过了一些内容......
答案 0 :(得分:3)
-ansi
是没有GNU扩展的默认标准的别名。我建议改为明确使用-std=c++98
,但它应该是g++ -ansi
的默认值,所以没有什么不同。
但一般来说,我从来没有见过任何被新gcc接受的东西,并且因为无效而被旧gcc拒绝。我怀疑任何这样的问题都是旧编译器或它的标准库中的错误。 Gcc没有针对正确的事情发出警告,但是不能使用旧版本的警告,因此您没有任何其他选择,只能使用旧版本进行测试。
至于你提到的具体问题:
-Wconversion
应该有所帮助。-Wno-sign-compare
编译。编译器不应该打印在-isystem
而不是-I
给出的目录中找到的标题的警告,这样可以让您静音Qt标题的警告并为您自己的代码启用它。所以你应该可以使用-Wconversion
。
答案 1 :(得分:1)
除了编译器之外,还可以使用lint或some other static analysis tool来检查代码。在我的Linux发行版中,apt-get install splint
将获得splint,也许会检查是否已为您的操作系统打包,以便于安装。