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

Kla*_*aim 117 c++ gcc clang c++11

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

我已经读到某处与某些扩展有关但我不清楚哪些扩展以及如何在新项目之间进行选择.

dar*_*rak 81

正如您自己发现的那样,两个选项之间的区别在于是否启用了违反/扩展C++标准的GNU扩展.这里描述 GNU C++扩展.您还可以在C++程序中使用大多数GNU C扩展(在此处描述).在这里阅读-WpedanticGCC选项也很有用.

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

  • 虽然这个答案是一个很好的通用答案,你会考虑编辑它,以便至少列出在`gnu11`中启用但在`c ++ 11`中没有启用的扩展名吗?您链接的列表是所有扩展名,并且您自己也指出其中一些也使用了`c ++ 11`(如`__restrict__`). (6认同)
  • 在许多情况下,扩展不违反标准 (4认同)
  • 是的,我避免使用扩展名,因为我不建议做任何未经标准明确规定的任何内容......但即便如此,"违反"是一个奇怪的,加载的术语,当很多这些扩展都是,使用Standardese ,只是_implementation-defined_或_specifying_标准是沉默的东西 - 或者甚至是所有的扩展...你是否通过做一些与标准明确定义的东西不同的东西来引用违反标准的任何GNU扩展? (3认同)