应该设置哪些GCC选项以使GCC尽可能严格? (我的意思是尽可能严格)我在C89写作,希望我的代码符合ANSI / ISO标准。
答案 0 :(得分:21)
我建议使用:
-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; { ... }
如果你很幸运,你不必担心。我在工作上没那么幸运,我不能使用严格的原型,这让我很懊恼,因为周围有太多草率的函数指针。
答案 1 :(得分:6)
这套选项非常好:
-Wall -Wextra -ansi -pedantic
您必须阅读文档,看看是否有任何额外警告被该组合遗漏。
您应该收到警告,严格的C89不包括对//
样式注释的支持,并且对具有外部链接的对象名称中的重要字符数有一些相当严格的限制。