为什么C11标准不是gcc的默认选项?

3
如果您查看标准,您会发现它们确实支持C11和C99。但是如果您尝试在不指定标准的情况下编译代码,则GCC仍将使用C89/C90。
这背后的原因是什么呢?
我的意思是,通常情况下,当新的语言标准发布时,编译器都会遵循新规则。为什么gcc编译器的行为不同呢?

3
不。我在谈论C11 - DeMarco
3
C语言和C++语言都在2011年发布了新的标准,其中C语言的标准被命名为C11。 - templatetypedef
3
我不认为他是。链接的文件甚至包括文本“C语言标准的第四个版本,即C11,已于2011年作为ISO/IEC 9899:2011发布。” - Tommy
6
默认情况下,它使用gnu89作为默认设置,因此gcc默认情况下不能作为C编译器工作。 - Ryan Haining
2
根据手册,如果没有给出C语言方言选项,则默认值为-std=gnu90;这意味着在未来的某个版本中将更改为-std=gnu11。不过我不会抱太大希望——它曾经也是关于gnu99的同样说法... - Christoph
显示剩余3条评论
2个回答

6

99.99%的C90编写的代码可以在C99编译器下完美编译,但并非全部。

由于GCC实际上是Unix安装的支柱,并且默认情况下认为新的编译器不会破坏旧软件,因此绝对的向后兼容性是最重要的。

对于新软件来说,明确指定C99比回过头去审计所有旧软件并确定哪些部分需要明确保留为C90更容易。


1
你需要定义“首选”。作为一名计算机用户,如果你敢于升级编译器,你是否愿意让一些软件不再工作呢? - Sneftel
2
@DeMarco:继承一份你不知道它在做什么的代码,升级编译器,然后突然它甚至无法编译,你也不知道为什么,这真的很可怕。(我曾经有过这样的经历) - Mooing Duck
2
@MooingDuck:当新的优化或略微更改的优化默默地打破您对UB(即使您本来不应该有任何UB)的假设时,情况会更加可怕。 - Deduplicator
2
当编译旧软件时,如果需要,将“-std = gnu89”或“-std = c89”添加到“CFLAGS”中总是微不足道的。因此,我认为“不破坏旧软件”不是一个有力的论点。我更希望看到不兼容C99 / C11的旧软件默认情况下崩溃(通过使用“CFLAGS”轻松修复),以便它可以得到修复而不是腐烂。 - R.. GitHub STOP HELPING ICE
3
祝你好运,除非你使用与包作者完全相同的发行版/版本,否则很难找到一个可以正常工作的软件包。由于库版本不同、默认 CFLAGS 中愚蠢的 -Werror 可能在编译器作者添加新警告时失效、对文件系统布局的假设等问题,通常至少需要微调一些内容。 - R.. GitHub STOP HELPING ICE
显示剩余7条评论

4
答案在你提供的页面中:
GCC支持三个版本的C标准,尽管对于最新版本的支持还不完整。支持C99已经相当完整,但我认为还有一些小细节尚未实现。根据该页面的说明,他们打算在将来的版本中将带有GNU扩展的C11设置为默认版本。

5
他们也打算将带有GNU扩展的C99设置为默认值,我仍在等待这个实现。 - Christoph
@Christoph:是的,每个新版本都会向语言添加一些非平凡的功能(VLAs、扩展数字能力和线程),如果他们现在还没有完成对C99的支持,那么C11的支持就不可能实现了。 - John Bode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接