为什么C标准C11不是';在gcc中不违约?
如果您查看,您会发现它们确实包括对C11和C99的支持。但是,如果您试图编译代码而不指定标准,GCC仍将使用C89/C90 这背后的原因是什么 我的意思是,在其他语言中,通常每当发布新标准时,编译器都会被设置为遵循新规则为什么C标准C11不是';在gcc中不违约?,c,gcc,standards,C,Gcc,Standards,如果您查看,您会发现它们确实包括对C11和C99的支持。但是,如果您试图编译代码而不指定标准,GCC仍将使用C89/C90 这背后的原因是什么 我的意思是,在其他语言中,通常每当发布新标准时,编译器都会被设置为遵循新规则 为什么这种行为与gcc编译器不同 99.99%为C90编写的代码将在C99编译器下干净编译,但不是100%。由于GCC实际上是Unix安装的主干,并且隐含着新编译器不会破坏旧软件的假设,因此绝对向后兼容性是最高优先级。为新软件显式指定C99比返回并审核所有旧软件以查看哪些位需要
为什么这种行为与gcc编译器不同 99.99%为C90编写的代码将在C99编译器下干净编译,但不是100%。由于GCC实际上是Unix安装的主干,并且隐含着新编译器不会破坏旧软件的假设,因此绝对向后兼容性是最高优先级。为新软件显式指定C99比返回并审核所有旧软件以查看哪些位需要显式保留到C90更容易。答案在您链接的页面中: GCC支持C标准的三个版本,尽管对最新版本的支持尚未完成。
对C99的支持基本上已经完成,但我认为还有一些小事情尚未实现。根据该页面,他们打算在未来版本中将带有GNU扩展的C11作为默认版本“FoggyDay”C和C++都有2011新标准发布,C11是当年发布的C语言标准。ANSI C是GNU代码推荐的,这可能是原因之一。我不认为他是。链接的文档甚至包含文本“C标准的第四个版本,即C11,于2011年作为ISO/IEC 9899:2011发布。”它默认为gnu89,因此默认情况下gcc不作为C编译器工作。您需要定义“首选”。作为一个计算机用户,如果你敢升级你的编译器,你愿意让你的一些软件不再工作吗?@DeMarco:继承你不知道它做什么的代码,升级一个编译器,突然它甚至不能编译,你不知道为什么,这很可怕。(我去过那里)@MooingDuck:当新的优化——或者稍微改变的优化——悄悄地打破你对UB的假设时(你无论如何都不应该在UB上做任何假设)。在编译旧软件时,如果必要的话,将
-std=gnu89
或-std=c89
添加到CFLAGS
中总是很容易的。所以我不认为“不破坏旧软件”是一个强有力的论据。我更希望看到C99-/C11不兼容的旧软件在默认情况下崩溃(使用CFLAGS
)以便得到修复,而不是腐烂。@Sneftel:除非您运行的是与包作者完全相同的发行版/版本,否则很幸运找到一个可以正常工作的包。在不同的库版本之间,一些愚蠢的事情,比如默认情况下的-Werror
CFLAGS
一旦编译器作者添加了一个新的警告,关于文件系统布局的假设,通常至少有一些东西需要调整…他们还打算将带有GNU扩展的C99作为默认值,我仍在等待这一切的发生…@Christoph:是的,每一个新版本都在为语言添加一些非琐碎的内容(VLAs、扩展数字功能、线程),如果他们现在还没有完成C99支持,C11支持就不会发生。