作为gcc和clang的编译参数,-std=c++11
和-std=gnu++11
之间有什么区别?与c99
和gnu99
同样的问题?我了解C++和C标准,这是我感兴趣的参数差异。-std = C++ 11和-std = gnu ++ 11之间有什么区别?
我读过的地方,它与一些扩展有关,但它不知道哪些,以及如何选择一个或另一个新项目。
作为gcc和clang的编译参数,-std=c++11
和-std=gnu++11
之间有什么区别?与c99
和gnu99
同样的问题?我了解C++和C标准,这是我感兴趣的参数差异。-std = C++ 11和-std = gnu ++ 11之间有什么区别?
我读过的地方,它与一些扩展有关,但它不知道哪些,以及如何选择一个或另一个新项目。
正如你自己发现的,两种选择之间的区别在于是否启用违反C++标准的GNU扩展。 GNU扩展描述为here。请注意,使用-std=c++11
时,一些扩展名仍可以生效,只要它们与标准不矛盾即可。
例如,当使用MinGW编译器时,我需要工作Boost.Lexical_Cast
的扩展。但是,只要你没有使用它们,你最好坚持标准而不扩展以实现最大的便携性。如果您发现自己被迫更改编译器,这可能会派上用场。
在许多情况下,扩展不违反标准 –
是的,我避免扩展,因为我不建议做任何不是标准专门定义的任何东西......但即使如此,“违反”是一个奇怪的和加载当许多这些扩展是使用Standardese时,只是_implementation-definitions_或_specifying_标准没有提及的事情 - 甚至可能是所有的扩展......你有没有引用任何违反GNU扩展的扩展通过做一些与标准明确定义的东西不同的标准? –
尽管这个答案是一个很好的通用方法,但是您会考虑编辑它,以便至少列出在'gnu11'中启用的扩展名,但不在'C++ 11'中?链接到的列表是所有扩展名,并且您自己指出其中一些列表也可以使用“C++ 11”(如'__restrict__')。 – einpoklum
'gnu'的确引用了扩展,如果你想编写可移植的代码,你应该坚持一个标准并完全避免扩展。 – juanchopanza