2012-01-20 27 views
20

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

+0

请严格遵守相关标准。 ANSI X3.159-1989和/或ISO/IEC 9899:1990,ISO/IEC 9899:1999或ISO/IEC工作组的“C1X”(http://www.open-std.org/JTC1/SC22/ WG14)(JTC1/SC22/WG14)。 ANSI C和ISO C90仅在标准本身的章节编号方面有所不同AFAIK – mctylr

+0

@mctylr:“我在C89中编写”似乎非常清晰。 –

+2

严格地说,C89不符合ANSI/ISO标准。目前的ISO C标准是2011年发布的标准;这也是目前的ANSI C标准; 1989年,1990年和1999年的标准已经过时。但这只是对措辞的一种狡辩;对于C89/C90仍然有广泛的支持(比C99更多),即使它不再是官方标准,你仍然可以遵循它。 –

回答

18

我推荐使用:

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

你应该-O以及-g编译一些警告是只有在优化器使用(实际上,我通常使用-O3为察觉的问题)可用。您可能更喜欢-std=gnu89,因为这会禁用库中较少的扩展名。 OTOH,如果你编码严格的ANSI C89,也许你希望他们禁用。 -ansi选项相当于-std=c89,但不够明确或灵活。

缺失的原型会警告您在使用(或外部函数定义)时没有原型的函数。严格的原型意味着你不能在函数声明或定义(或函数指针)中使用'空括号';您需要(void)或正确的参数列表。旧的样式定义斑点ķ& [R风格定义,比如:

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

如果幸运的话,你将不再需要担心。我在工作中并不那么幸运,我也不能使用严格的原型,这让我很懊恼,因为周围有太多懒散的函数指针。

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

+1

'-Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition'选项是一个好主意,但它们不符合标准的一致性。自1989年以来,旧式函数声明和定义已经过时,但它们仍然是语言的一部分;即使符合C2011的编译器也需要支持它们。 –

+1

@Keith:你在阅读时打开了'-pedantic'标志:D是的,但我仍然推荐使用这些选项,以便代码可以最大程度地向前移植到标准的更高版本。我不会惊讶地发现,C2021最终失去了对非原型功能的标准支持,虽然实现后可能会继续支持旧的标记10 - 20年。 C11也消除了'gets()';我不认为它会长时间从图书馆消失。即使它完全符合C89,也应该避免。 –

+0

我写了一篇文章:http://shitalshah.com/p/how-to-enable-and-use-gcc-strict-mode-compilation/ – ShitalShah

6

这组选项是相当不错的:

-Wall -Wextra -ansi -pedantic 

你必须阅读文档,看看是否存在由该组合得到冷落任何额外的警告。

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

+0

文档说“-ansi -pedantic”应该为你提供严格的ISO C90,并且会警告任何GNU C扩展(不仅仅是那些不兼容的)。如果你想要错误,你可以使用“-pedantic-errors”。虽然不是严格的问题,但您可以考虑“错误”,将警告转化为错误。尽管在哲学上“警告并非错误” –