为了让GCC尽可能严格,应该设置哪些GCC选项?(我是指尽可能严格)我正在使用C89编写代码,并希望我的代码符合ANSI/ISO标准。
为了让GCC尽可能严格,应该设置哪些GCC选项?(我是指尽可能严格)我正在使用C89编写代码,并希望我的代码符合ANSI/ISO标准。
-Wall -Wextra -std=c89 -pedantic -Wmissing-prototypes -Wstrict-prototypes \
-Wold-style-definition
为了获得一些只有在使用优化器时才能获得的警告信息(实际上,我通常使用-O3
来发现问题),你应该使用-O
和-g
编译。你可能更喜欢使用-std=gnu89
,因为这样可以在库中禁用较少的扩展。另一方面,如果你正在编写严格的ANSI C89代码,也许你希望禁用它们。选项-ansi
等同于-std=c89
,但不够明确或灵活。
缺少原型会警告那些在作用域内没有原型的被使用(或外部函数定义)。严格的原型意味着你不能对函数声明或定义(或函数指针)使用“空括号”;你需要使用(void)
或正确的参数列表。旧式的定义可以检测到K&R风格的函数定义,例如:
int old_style(a, b) int a; double b; { ... }
如果你很幸运的话,你不需要担心这个。但是我在工作中没那么幸运,因为有太多松散的函数指针,所以我不能使用严格的原型,这让我非常沮丧。
另请参见:最佳命令行工具清理代码是什么
-pedantic
标志 :D 是的,但我仍然建议使用这些选项,以便代码在后续版本的标准中最大程度地向前兼容。我不会感到惊讶,如果发现C2021最终失去对非原型函数的标准支持,尽管实现可能会在此之后的10-20年内继续支持旧的符号表示法。C11还消除了gets()
; 我不希望它从库中消失太久。即使它完全符合C89,也应该避免使用。 - Jonathan Leffler__VA_ARGS__
宏相关 - 必须在某个地方使用? 还是其他什么。 我查看了错误报告,坦率地说,对所需更改并不了解。 - Jonathan Leffler这组选项相当不错:
-Wall -Wextra -ansi -pedantic
您需要阅读文档以查看是否有任何额外的警告被该组合省略。
请注意,严格的C89不包括对//
样式注释的支持,并且对具有外部链接的对象名称中重要字符数量有一些严格限制。