为什么C标准C11不是';在gcc中不违约?

为什么C标准C11不是';在gcc中不违约?,c,gcc,standards,C,Gcc,Standards,如果您查看,您会发现它们确实包括对C11和C99的支持。但是,如果您试图编译代码而不指定标准,GCC仍将使用C89/C90 这背后的原因是什么 我的意思是,在其他语言中,通常每当发布新标准时,编译器都会被设置为遵循新规则 为什么这种行为与gcc编译器不同 99.99%为C90编写的代码将在C99编译器下干净编译,但不是100%。由于GCC实际上是Unix安装的主干,并且隐含着新编译器不会破坏旧软件的假设,因此绝对向后兼容性是最高优先级。为新软件显式指定C99比返回并审核所有旧软件以查看哪些位需要

如果您查看,您会发现它们确实包括对C11和C99的支持。但是,如果您试图编译代码而不指定标准,GCC仍将使用C89/C90

这背后的原因是什么

我的意思是,在其他语言中,通常每当发布新标准时,编译器都会被设置为遵循新规则


为什么这种行为与gcc编译器不同

99.99%为C90编写的代码将在C99编译器下干净编译,但不是100%。由于GCC实际上是Unix安装的主干,并且隐含着新编译器不会破坏旧软件的假设,因此绝对向后兼容性是最高优先级。为新软件显式指定C99比返回并审核所有旧软件以查看哪些位需要显式保留到C90更容易。

答案在您链接的页面中:

GCC支持C标准的三个版本,尽管对最新版本的支持尚未完成。


对C99的支持基本上已经完成,但我认为还有一些小事情尚未实现。根据该页面,他们打算在未来版本中将带有GNU扩展的C11作为默认版本-std=gnu89
-std=c89
添加到
CFLAGS
中总是很容易的。所以我不认为“不破坏旧软件”是一个强有力的论据。我更希望看到C99-/C11不兼容的旧软件在默认情况下崩溃(使用
CFLAGS
)以便得到修复,而不是腐烂。@Sneftel:除非您运行的是与包作者完全相同的发行版/版本,否则很幸运找到一个可以正常工作的包。在不同的库版本之间,一些愚蠢的事情,比如默认情况下的
-Werror
CFLAGS
一旦编译器作者添加了一个新的警告,关于文件系统布局的假设,通常至少有一些东西需要调整…他们还打算将带有GNU扩展的C99作为默认值,我仍在等待这一切的发生…@Christoph:是的,每一个新版本都在为语言添加一些非琐碎的内容(VLAs、扩展数字功能、线程),如果他们现在还没有完成C99支持,C11支持就不会发生。