微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 编写代码的方式非常迂腐

我想找出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 举报,一经查实,本站将立刻删除。

相关推荐