我想找出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拒绝.我怀疑任何这样的问题都是旧编译器或它的标准库中的错误. Gcc没有针对正确的事情发出警告,但是对于旧版本的版本不起作用,因此除了使用旧版本测试之外没有任何其他选项.
至于你提到的具体问题:
>将double传递给期望int的函数不是错误.但它可能是未定义的行为. -Wconversion应该有所帮助.
>使用unsigned进行比较也很明确,也总是按照定义进行工作,并且在相等的情况下,比较实际上会使程序员编写更糟糕的代码(将大于int的无符号变量与-1进行比较除了将其与-1u进行比较之外的其他内容).所以我实际上总是使用-Wno-sign-compare进行编译.
编译器不应该打印在使用-isystem而不是-I给出的目录中找到的标头的警告,这样可以让你静音Qt标头的警告并为你自己的代码保持启用状态.所以你应该能够使用-Wconversion.