应该设置哪些GCC选项让GCC尽可能严格? (我的意思是尽可能严格)我在C89编写,并希望我的代码符合ANSI/ISO。最强C代码的GCC选项?
回答
我推荐使用:
-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; { ... }
如果幸运的话,你将不再需要担心。我在工作中并不那么幸运,我也不能使用严格的原型,这让我很懊恼,因为周围有太多懒散的函数指针。
'-Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition'选项是一个好主意,但它们不符合标准的一致性。自1989年以来,旧式函数声明和定义已经过时,但它们仍然是语言的一部分;即使符合C2011的编译器也需要支持它们。 –
@Keith:你在阅读时打开了'-pedantic'标志:D是的,但我仍然推荐使用这些选项,以便代码可以最大程度地向前移植到标准的更高版本。我不会惊讶地发现,C2021最终失去了对非原型功能的标准支持,虽然实现后可能会继续支持旧的标记10 - 20年。 C11也消除了'gets()';我不认为它会长时间从图书馆消失。即使它完全符合C89,也应该避免。 –
我写了一篇文章:http://shitalshah.com/p/how-to-enable-and-use-gcc-strict-mode-compilation/ – ShitalShah
这组选项是相当不错的:
-Wall -Wextra -ansi -pedantic
你必须阅读文档,看看是否存在由该组合得到冷落任何额外的警告。
您应该警告严格的C89不包括对//
样式注释的支持,并且对于具有外部链接的对象名称中的重要字符数有一些相当严重的限制。
文档说“-ansi -pedantic”应该为你提供严格的ISO C90,并且会警告任何GNU C扩展(不仅仅是那些不兼容的)。如果你想要错误,你可以使用“-pedantic-errors”。虽然不是严格的问题,但您可以考虑“错误”,将警告转化为错误。尽管在哲学上“警告并非错误” –
- 1. 严格C90代码的GCC选项?
- 2. eclipse c/C++项目,GCC编译G ++代码
- 3. 可用于C/C++的最强密码?
- 4. GCC的代码覆盖选项如何工作?
- 5. GCC中的-c选项做什么
- 6. 用GCC编译的16位C代码
- 7. GCC源代码中的C语法
- 8. C++代码强制括号
- 9. 替代GCC 3.4.3选项-fstack-protector-all?
- 10. 关于GCC编译x86_64的代码和C代码优化
- 11. gcc -c选项如何工作?
- 12. GCC C++和内联汇编代码?
- 13. 使用GCC预处理C代码
- 14. gcc编译无效C代码
- 15. GCC源代码目录(.c文件)
- 16. 如何用GCC编译Objective-C代码?
- 17. 使用/ clr选项编译C代码
- 18. gcc -finline-functions选项
- 19. GCC优化选项
- 20. GCC链接选项
- 21. 关于gcc选项
- 22. gcc解析代码
- 23. 如何强制gcc生成裸机代码(不要使用伪代码)
- 24. 转换的Visual C/C++联汇编代码到GCC等效代码
- 25. 编译C++代码有增强的regex_match
- 26. C++与GCC /码块
- 27. gcc的-fforce-MEM选项
- 28. gcc中的-l选项
- 29. -gcc的静态选项?
- 30. linting的选项Cython代码
请严格遵守相关标准。 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
@mctylr:“我在C89中编写”似乎非常清晰。 –
严格地说,C89不符合ANSI/ISO标准。目前的ISO C标准是2011年发布的标准;这也是目前的ANSI C标准; 1989年,1990年和1999年的标准已经过时。但这只是对措辞的一种狡辩;对于C89/C90仍然有广泛的支持(比C99更多),即使它不再是官方标准,你仍然可以遵循它。 –