Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
最严格的C代码的GCC选项?_C_Gcc_Ansi_Iso_Strict - Fatal编程技术网

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

最严格的C代码的GCC选项?,c,gcc,ansi,iso,strict,C,Gcc,Ansi,Iso,Strict,应设置哪些GCC选项以使GCC尽可能严格?(我的意思是尽可能严格)我用C89编写代码,希望我的代码符合ANSI/ISO。这组选项非常好: -Wall -Wextra -ansi -pedantic 您必须阅读文档,以查看该组合是否遗漏了任何额外的警告 您应该注意,strict C89不支持/样式的注释,并且对具有外部链接的对象名称中的有效字符数有一些非常严格的限制。我建议使用: -Wall -Wextra -std=c89 -pedantic -Wmissing-prototypes -Wst

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

这组选项非常好:

-Wall -Wextra -ansi -pedantic
您必须阅读文档,以查看该组合是否遗漏了任何额外的警告

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

我建议使用:

-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; { ... }
如果你幸运的话,你就不用担心了。我在工作中没有那么幸运,我不能使用严格的原型,这让我很懊恼,因为有太多草率的函数指针


另请参阅:

文档中说“-ansi-pedantic”应该让您严格遵守ISO C90,并且会在任何GNU C扩展上发出警告(不仅仅是那些不兼容的扩展)。如果需要错误,可以使用“-pedantic errors”。虽然不是一个严格的问题,你可以考虑“Werror”,它会把警告变成错误。虽然从哲学上讲,对于最严格的标准来说“警告不是错误”,但您应该清楚您所针对的标准。ANSI X3.159-1989和/或ISO/IEC 9899:1990、ISO/IEC 9899:1999或ISO/IEC工作组()的“C1X”(JTC1/SC22/WG14)。ANSI C和ISO C90仅在标准本身的章节编号上有所不同AFAIK@mctylr:“我是用C89写的”似乎非常清楚。严格地说,C89不符合ANSI/ISO标准。目前的ISO C标准是2011年发布的标准;这也是当前的ANSI C标准;1989年、1990年和1999年的标准已经正式过时。但这只是在措辞上的狡辩;C89/C90仍然得到广泛支持(比C99更多),即使它不再是官方标准,您也可以遵守它。@KeithThompson我不确定是否有“希望我的代码是最新的ANSI/ISO标准”中的隐含最新版本“
-Wmissing prototype-Wstrict prototype-Wold样式定义”选项是一个好主意,但它们不能解决标准一致性问题。自1989年以来,旧式的函数声明和定义已经过时,但它们仍然是语言的一部分;即使是符合C2011标准的编译器也需要支持它们。@Keith:您在阅读时打开了
-pedantic
标志:D是的,但我仍然建议使用这些选项,以便代码最大限度地向前移植到标准的更高版本。当我发现C2021最终失去了对非原型函数的标准支持时,我并不感到惊讶,尽管在那之后的10-20年内,实现可能会继续支持旧的符号。C11还消除了
get()
;我也不希望它在很长一段时间内从图书馆消失。即使它完全兼容C89,也应该避免使用它。我在上面写了一篇帖子:@ShitalShah:interest。你的博客是C++,而不是C,但没关系。我对“ISOC99需要使用REST参数”的消息感到困惑(特别是在C++编译中)。我不清楚那是什么意思。它是否与
\uu VA\u ARGS\uu
宏相关-它必须在某个地方使用?或者是别的什么。我看了一下bug报告,坦率地说,对于所需的更改我并不了解。