我想找出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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。