来自Bjarne Stroustrup C0x常见问题解答: ∮ ∮ ∮ ∮ ∮一个月一个月 在C11中,宏__cplusplus将被设置为不同于(大于)当前199711L的值。 虽然这并不像人们希望的那样有帮助。gcc(显然有将近10年的时间)将这个值设置为1,排除了一个主要的编译器,直到it was fixed when gcc 4.7.0 came out。 MSVC也没有正确设置这个宏,默认情况下,不管语言版本如何,它都被定义为199711L,您要么需要将/Zc:__cplusplus添加到编译器标志中,要么检查MSVC特定的宏_MSVC_LANG,它总是有正确的值。 这些是C++标准,以及您应该能够在__cplusplus中期待的值:
C98之前的 C :是一米九氮一。
C++98语言:__cplusplus是199711L。
C98 +测试报告1:这读起来像C98,没有办法检查,我知道的。
C++11语言:__cplusplus是201103L。
C++14语言:__cplusplus是201402L。
C++17语言:__cplusplus是201703L。
C++20语言:__cplusplus是202002L。
如果编译器可能是旧的gcc,我们需要求助于编译器特定的黑客攻击(查看版本宏,将其与包含已实现功能的表格进行比较)或使用Boost.Config(它提供了相关的宏)。这样做的好处是我们实际上可以挑选新标准的特定特性,如果特性缺失,编写一个变通方案。这通常比批发解决方案更受欢迎,因为一些编译器会声称实现了C++11,但只提供了特性的子集。 Stdcxx Wiki托管了一个comprehensive matrix for compiler support of C++0x features (archive.org link)(如果您敢于自己检查特性的话)。 不幸的是,更细粒度的特性检查(例如,像std::copy_if这样的单个库函数)只能在应用程序的构建系统中完成(运行带有特性的代码,检查它是否编译并产生正确的结果-如果采用这条路线,autoconf是首选工具)。
9条答案
按热度按时间qpgpyjmq1#
来自Bjarne Stroustrup C0x常见问题解答:
∮ ∮ ∮ ∮ ∮一个月一个月
在C11中,宏
__cplusplus
将被设置为不同于(大于)当前199711L
的值。虽然这并不像人们希望的那样有帮助。
gcc
(显然有将近10年的时间)将这个值设置为1
,排除了一个主要的编译器,直到it was fixed when gcc 4.7.0 came out。MSVC也没有正确设置这个宏,默认情况下,不管语言版本如何,它都被定义为
199711L
,您要么需要将/Zc:__cplusplus
添加到编译器标志中,要么检查MSVC特定的宏_MSVC_LANG
,它总是有正确的值。这些是C++标准,以及您应该能够在
__cplusplus
中期待的值:__cplusplus
是199711L
。__cplusplus
是201103L
。__cplusplus
是201402L
。__cplusplus
是201703L
。__cplusplus
是202002L
。如果编译器可能是旧的
gcc
,我们需要求助于编译器特定的黑客攻击(查看版本宏,将其与包含已实现功能的表格进行比较)或使用Boost.Config(它提供了相关的宏)。这样做的好处是我们实际上可以挑选新标准的特定特性,如果特性缺失,编写一个变通方案。这通常比批发解决方案更受欢迎,因为一些编译器会声称实现了C++11,但只提供了特性的子集。Stdcxx Wiki托管了一个comprehensive matrix for compiler support of C++0x features (archive.org link)(如果您敢于自己检查特性的话)。
不幸的是,更细粒度的特性检查(例如,像
std::copy_if
这样的单个库函数)只能在应用程序的构建系统中完成(运行带有特性的代码,检查它是否编译并产生正确的结果-如果采用这条路线,autoconf
是首选工具)。tyu7yeag2#
请运行以下代码来检查版本。
qvtsj1bj3#
据我所知,没有一个完整的方法可以做到这一点,如果你查看跨平台/多编译器支持库的头文件,你总是会发现很多定义使用编译器特定的结构来确定这样的事情:
您可能必须为您使用的所有编译器自己定义这样的定义。
anauzrmj4#
通常你应该使用
__cplusplus
define来检测c++17,但是默认情况下microsoft编译器不能正确定义宏,参见https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/-你需要修改项目设置以包含/Zc:__cplusplus
开关,或者你可以使用如下语法:ryevplcw5#
Boost.Config可能会帮助你,这取决于你想要实现什么。它不提供标准版本的检测,但它提供了宏,让你检查对特定语言/编译器特性的支持。
rhfm7lfc6#
__加加
在C0x中,宏__cplusplus将被设置为不同于(大于)当前199711L的值。
BS提供的C0x常见问题解答
kupeojn67#
按建议使用
__cplusplus
。Microsoft编译器只有一个注意事项,使用Zc:__cplusplus
编译器开关启用__cplusplus
源代码https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
rekjcdws8#
在quick google之后:
__STDC__
和__STDC_VERSION__
,参见herebvhaajcl9#
对于cmake项目,可以用途:
字体:https://peter-bloomfield-online.translate.goog/report-__cplusplus-correctly-with-cmake-and-visual-studio/?_x_tr_sl=en&_x_tr_tl=pt&_x_tr_hl=pt-BR&_x_tr_pto=sc