最严格的 C 代码的 GCC 选项? [复制]

Posted

技术标签:

【中文标题】最严格的 C 代码的 GCC 选项? [复制]【英文标题】:GCC options for strictest C code? [duplicate] 【发布时间】:2012-02-15 08:04:33 【问题描述】:

应该设置哪些 GCC 选项以使 GCC 尽可能严格? (我的意思是尽可能严格)我正在使用 C89 编写代码,并且希望我的代码符合 ANSI/ISO。

【问题讨论】:

严格来说,您应该清楚您所针对的标准。 ANSI X3.159-1989 和/或 ISO/IEC 9899:1990、ISO/IEC 9899:1999 或来自 ISO/IEC 工作组 (open-std.org/JTC1/SC22/WG14) (JTC1/SC22/WG14) 的“C1X”。 ANSI C 和 ISO C90 仅在标准本身的部分编号不同 AFAIK @mctylr:“我正在用 C89 写作”似乎非常清楚。 严格来说,C89 不符合 ANSI/ISO。当前的 ISO C 标准是 2011 年发布的标准;这也是当前的 ANSI C 标准; 1989、1990 和 1999 标准已正式过时。但这只是措辞上的狡辩。仍然广泛支持 C89/C90(超过 C99),即使它不再是官方标准,您仍然可以遵守它。 @KeithThompson 我不确定是否有隐含的 latest 如“...希望我的代码是 latest ANSI/ISO标准投诉”。 【参考方案1】:

这组选项还不错:

-Wall -Wextra -ansi -pedantic

您必须阅读文档以查看该组合是否遗漏了任何额外的警告。

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

【讨论】:

文档说“-ansi -pedantic”应该让您获得严格的 ISO C90,并且会警告任何 GNU C 扩展(不仅仅是那些不兼容的扩展)。如果需要错误,可以使用“-pedantic-errors”。虽然不是真正的严格问题,但您可以考虑“-Werror”,它将警告变成错误。虽然在哲学上“警告不是错误”【参考方案2】:

我建议使用:

-Wall -Wextra -std=c89 -pedantic -Wmissing-prototypes -Wstrict-prototypes \
    -Wold-style-definition

您应该使用-O-g 进行编译,因为某些警告仅在使用优化器时可用(实际上,我通常使用-O3 来发现问题)。您可能更喜欢-std=gnu89,因为它会禁用库中的较少扩展。 OTOH,如果您要编码为严格的 ANSI C89,也许您希望禁用它们。 -ansi 选项等效于 -std=c89,但没有那么明确或灵活。

缺少原型会警告您使用的函数(或定义的外部函数)在范围内没有原型。严格的原型意味着你不能对函数声明或定义(或函数指针)使用“空括号”;您需要(void) 或正确的参数列表。旧样式定义点 K&R 样式函数定义,如:

int old_style(a, b) int a; double b;  ... 

如果你幸运的话,你就不用担心这个了。我在工作上没有那么幸运,我不能使用严格的原型,这让我很懊恼,因为周围有太多草率的函数指针。

另请参阅:What is the best command-line tool to clean up code

【讨论】:

-Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition 选项是个好主意,但它们不符合标准。自 1989 年以来,旧式函数声明和定义已经过时,但它们仍然是语言的一部分;甚至需要符合 C2011 的编译器来支持它们。 @Keith:您在阅读中打开了-pedantic 标志:D 是的,但我仍然建议使用这些选项,以便代码最大程度地向前移植到标准的更高版本。发现 C2021 最终失去了对非原型功能的标准支持,我并不感到惊讶,尽管在此之后的 10 到 20 年内,实现可能会继续支持旧的符号。 C11还消除了gets();我也不希望它在很长一段时间内从图书馆消失。应该避免它,即使它完全符合 C89 标准。 我写了一篇关于这个的帖子:shitalshah.com/p/… @ShitalShah:很有趣。您的博客是关于 C++ 而不是 C,但没关系。我对“ISO C99 需要使用其余参数”消息感到困惑(尤其是在 C++ 编译中)。我不清楚那是什么意思。它是否与__VA_ARGS__ 宏有关——它必须在某处使用?或者是别的什么。我查看了错误报告,坦率地说,我对所需的更改并不了解。

以上是关于最严格的 C 代码的 GCC 选项? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

gcc编译选项pedantic(GCC编译器的C++标准严格模式)

gcc 编译控制选项

gcc命令

gcc常用命令

gcc的简单用法

GCC警告选项例解