GCC选项用于最严格的C代码?

31

为了让GCC尽可能严格,应该设置哪些GCC选项?(我是指尽可能严格)我正在使用C89编写代码,并希望我的代码符合ANSI/ISO标准。


为了最严格的要求,您应该清楚地知道您所针对的标准。这些标准包括ANSI X3.159-1989和/或ISO/IEC 9899:1990、ISO/IEC 9899:1999或ISO/IEC工作组(http://www.open-std.org/JTC1/SC22/WG14)(JTC1/SC22/WG14)的“C1X”。据我所知,ANSI C和ISO C90只在标准本身的章节编号上有所不同。 - mctylr
2
“我正在使用C89编写代码”似乎非常清晰明了。 - Keith Thompson
2
严格来说,C89不符合ANSI/ISO标准。当前的ISO C标准是2011年发布的标准;这也是当前的ANSI C标准;1989、1990和1999年的标准已经正式过时。但这只是对措辞的吹毛求疵;仍然有广泛的支持C89/C90(比C99还要多),即使它已不再是官方标准,你仍然可以符合它。 - Keith Thompson
@KeithThompson 我不确定是否有隐含的“最新”一词,例如:“我希望我的代码符合最新的 ANSI/ISO 标准”。 - mctylr
2个回答

30
我建议使用:
-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; { ... }

如果你很幸运的话,你不需要担心这个。但是我在工作中没那么幸运,因为有太多松散的函数指针,所以我不能使用严格的原型,这让我非常沮丧。

另请参见:最佳命令行工具清理代码是什么


1
“-Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition”选项是个好主意,但它们并不能解决标准符合性的问题。自1989年以来,旧式函数声明和定义已经过时,但它们仍然是语言的一部分;即使是符合C2011标准的编译器也必须支持它们。 - Keith Thompson
1
@Keith:你在阅读中打开了-pedantic标志 :D 是的,但我仍然建议使用这些选项,以便代码在后续版本的标准中最大程度地向前兼容。我不会感到惊讶,如果发现C2021最终失去对非原型函数的标准支持,尽管实现可能会在此之后的10-20年内继续支持旧的符号表示法。C11还消除了gets(); 我不希望它从库中消失太久。即使它完全符合C89,也应该避免使用。 - Jonathan Leffler
我写了一篇关于此的文章:http://shitalshah.com/p/how-to-enable-and-use-gcc-strict-mode-compilation/ - Shital Shah
@ShitalShah:有趣。你的博客是关于C++而不是C,但没关系。我对“ISO C99要求使用剩余参数”消息感到困惑(特别是在C++编译中)。 我不清楚这是什么意思。 它是否与__VA_ARGS__宏相关 - 必须在某个地方使用? 还是其他什么。 我查看了错误报告,坦率地说,对所需更改并不了解。 - Jonathan Leffler

9

这组选项相当不错:

-Wall -Wextra -ansi -pedantic

您需要阅读文档以查看是否有任何额外的警告被该组合省略。

请注意,严格的C89不包括对//样式注释的支持,并且对具有外部链接的对象名称中重要字符数量有一些严格限制。


1
文档说明说,“-ansi -pedantic”应该让您严格遵循ISO C90,并警告任何GNU C扩展(不仅是不兼容的扩展)。如果您想要错误,可以使用“-pedantic-errors”。虽然这不是严格性的问题,但您可以考虑使用“-Werror”,它将把警告转换为错误。尽管在哲学上,“警告不是错误”。 - Jon L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接