2012-05-16 186 views
98

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

我读过的地方,它与一些扩展有关,但它不知道哪些,以及如何选择一个或另一个新项目。

+5

'gnu'的确引用了扩展,如果你想编写可移植的代码,你应该坚持一个标准并完全避免扩展。 – juanchopanza

回答

66

正如你自己发现的,两种选择之间的区别在于是否启用违反C++标准的GNU扩展。 GNU扩展描述为here。请注意,使用-std=c++11时,一些扩展名仍可以生效,只要它们与标准不矛盾即可。

例如,当使用MinGW编译器时,我需要工作Boost.Lexical_Cast的扩展。但是,只要你没有使用它们,你最好坚持标准而不扩展以实现最大的便携性。如果您发现自己被迫更改编译器,这可能会派上用场。

+4

在许多情况下,扩展不违反标准 –

+2

是的,我避免扩展,因为我不建议做任何不是标准专门定义的任何东西......但即使如此,“违反”是一个奇怪的和加载当许多这些扩展是使用Standardese时,只是_implementation-definitions_或_specifying_标准没有提及的事情 - 甚至可能是所有的扩展......你有没有引用任何违反GNU扩展的扩展通过做一些与标准明确定义的东西不同的标准? –

+4

尽管这个答案是一个很好的通用方法,但是您会考虑编辑它,以便至少列出在'gnu11'中启用的扩展名,但不在'C++ 11'中?链接到的列表是所有扩展名,并且您自己指出其中一些列表也可以使用“C++ 11”(如'__restrict__')。 – einpoklum

相关问题