-std = c ++ 11和-std = gnu ++ 11有什么区别?


132

gcc和clang -std=c++11-std=gnu++11as作为编译参数有什么区别?与c99和有相同的问题gnu99吗?我了解C ++和C标准,这是我感兴趣的参数差异。

我在某处读到它与某些扩展有关,但是对于一个新项目,我不清楚哪个扩展以及如何在一个或另一个之间进行选择。


5
gnu那些做参考的扩展,如果你想写可以移植的代码,你应该坚持一个标准,避免扩展干脆。
juanchopanza 2012年

Answers:


91

如您所知,这两个选项之间的区别在于是否启用了违反/扩展C ++标准的GNU扩展。这里描述 GNU C ++扩展。您还可以在C ++程序中使用大多数GNU C扩展(此处描述)。在此处阅读有关-WpedanticGCC选项的信息也将很有用。

请注意,使用时,某些扩展名仍然可以生效-std=c++11,只要它们与标准不矛盾即可。例如,当使用MinGW编译器时,我需要扩展才能正常工作Boost.Lexical_Cast。但是,只要您不使用它们中的任何一个,就最好坚持不扩展而无需最大扩展性的标准。如果您发现自己不得不更改编译器,这可能会派上用场。


4
是的,我避免使用扩展名,因为我不建议您做任何标准未明确定义的事情……但是即使那样,“违背”是一个奇怪且繁琐的术语,当其中许多扩展名使用Standardese时,只是实现定义指定标准未涉及的内容-甚至可能是所有扩展...您是否通过做与标准明确定义的不同的事情来引用任何违反标准的GNU扩展?
underscore_d 2016年

9
尽管此答案是一个很好的通用答案,但您是否考虑对其进行编辑,以便至少列出已启用gnu11但未启用的扩展c++11?您链接到的列表包含所有扩展名,正如您自己指出的那样,其中的某些扩展名也已启用c++11(例如__restrict__)。
einpoklum

我现在发现的内容(通过查看这些标志的文档永远无法得出结论)如下:-std = c ++ 11重新启用trigraphs -std = gnu ++ 11忽略它们并发出警告,像这样一起忽略-std时会执行
Daniel82
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.