如何确定编译器使用的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:
__cplusplus
是1
。 - C ++ 98:
__cplusplus
是199711L
。 - C + + 98 + TR1:这读取为C ++ 98,没有办法检查我知道。
- C ++ 11:
__cplusplus
是201103L
。 - C ++ 14:
__cplusplus
是201402L
。 - C ++ 17:
__cplusplus
是201703L
。
如果编译器可能是一个较老的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__
,请看这里