如何确定编译器使用的C ++标准的版本?

你如何确定你的编译器实现了什么版本的C ++标准? 据我所知,以下是我所知道的标准:

  • C ++ 03
  • C ++ 98

据我所知,没有全面的方法来做到这一点。 如果您查看跨平台/多个编译器支持库的头文件,您将会发现许多定义使用编译器特定的构造来确定这样的事情:

 /*Define Microsoft Visual C++ .NET (32-bit) compiler */ #if (defined(_M_IX86) && defined(_MSC_VER) && (_MSC_VER >= 1300) ... #endif /*Define Borland 5.0 C++ (16-bit) compiler */ #if defined(__BORLANDC__) && !defined(__WIN32__) ... #endif 

您可能必须这样做,为您使用的所有编译器自己定义。

从Bjarne Stroustrup C ++ 0x FAQ :

__cplusplus

在C ++ 0x中,macros__cplusplus将被设置为一个不同于(大于)当前199711L

虽然这不像人们想要的那样有帮助。 gcc (显然近10年)有这个值设置为1 ,排除了一个主要的编译器,直到gcc 4.7.0出来时修复 。

这些是C ++标准,你应该能够在__cplusplus期望什么价值:

  • C ++ pre-C ++ 98: __cplusplus1
  • C ++ 98: __cplusplus199711L
  • C + + 98 + TR1:这读取为C ++ 98,没有办法检查我知道。
  • C ++ 11: __cplusplus201103L
  • C ++ 14: __cplusplus201402L
  • C ++ 17: __cplusplus201703L

如果编译器可能是一个较老的gcc ,我们需要求助于编译器特定的hackery(看一个版本的macros,比较它与具有实现function的表)或使用Boost.Config (它提供相关的macros )。 这样做的好处是,我们实际上可以select新标准的特定function,如果function丢失,可以编写一个解决方法。 这通常比批发解决scheme更受欢迎,因为有些编译器会声称实现C ++ 11,但只提供一部分function。

Stdcxx Wiki 为C ++ 0xfunction的编译器支持提供了一个全面的matrix (如果您敢于自己检查这些function)。

不幸的是,只能在应用程序的构build系统中执行更细粒度的function检查(例如std::copy_if等单独的库函数)(运行具有该function的代码,检查是否编译并生成了正确的结果 – autoconf是如果采取这种方式,首选工具)。

根据你想要达到什么, Boost.Config可能会帮助你。 它不提供标准版本的检测,但它提供了macros,可以检查是否支持特定的语言/编译器function。

__cplusplus

在C ++ 0x中,macros__cplusplus将被设置为一个不同于(大于)当前199711L的值。

C + + 0x由BS的常见问题

快速谷歌后 :

__STDC____STDC_VERSION__ ,请看这里