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

m528fe3b  于 2023-03-14  发布在  其他
关注(0)|答案(9)|浏览(329)

你如何确定你的编译器实现的是C++标准的哪个版本?据我所知,下面是我所知道的标准:

  • C++03
  • C++98语言
qpgpyjmq

qpgpyjmq1#

来自Bjarne Stroustrup C0x常见问题解答:
∮ ∮ ∮ ∮ ∮一个月一个月
在C
11中,宏__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语言:__cplusplus199711L
  • C98 +测试报告1:这读起来像C98,没有办法检查,我知道的。
  • C++11语言:__cplusplus201103L
  • C++14语言:__cplusplus201402L
  • C++17语言:__cplusplus201703L
  • C++20语言:__cplusplus202002L

如果编译器可能是旧的gcc,我们需要求助于编译器特定的黑客攻击(查看版本宏,将其与包含已实现功能的表格进行比较)或使用Boost.Config(它提供了相关的宏)。这样做的好处是我们实际上可以挑选新标准的特定特性,如果特性缺失,编写一个变通方案。这通常比批发解决方案更受欢迎,因为一些编译器会声称实现了C++11,但只提供了特性的子集。
Stdcxx Wiki托管了一个comprehensive matrix for compiler support of C++0x features (archive.org link)(如果您敢于自己检查特性的话)。
不幸的是,更细粒度的特性检查(例如,像std::copy_if这样的单个库函数)只能在应用程序的构建系统中完成(运行带有特性的代码,检查它是否编译并产生正确的结果-如果采用这条路线,autoconf是首选工具)。

tyu7yeag

tyu7yeag2#

请运行以下代码来检查版本。

#include<iostream>

int main() {
    if (__cplusplus == 202101L) std::cout << "C++23";
    else if (__cplusplus == 202002L) std::cout << "C++20";
    else if (__cplusplus == 201703L) std::cout << "C++17";
    else if (__cplusplus == 201402L) std::cout << "C++14";
    else if (__cplusplus == 201103L) std::cout << "C++11";
    else if (__cplusplus == 199711L) std::cout << "C++98";
    else std::cout << "pre-standard C++." << __cplusplus;
    std::cout << "\n";
}
qvtsj1bj

qvtsj1bj3#

据我所知,没有一个完整的方法可以做到这一点,如果你查看跨平台/多编译器支持库的头文件,你总是会发现很多定义使用编译器特定的结构来确定这样的事情:

/*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

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

anauzrmj

anauzrmj4#

通常你应该使用__cplusplus define来检测c++17,但是默认情况下microsoft编译器不能正确定义宏,参见https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/-你需要修改项目设置以包含/Zc:__cplusplus开关,或者你可以使用如下语法:

#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
     //C++17 specific stuff here
#endif
ryevplcw

ryevplcw5#

Boost.Config可能会帮助你,这取决于你想要实现什么。它不提供标准版本的检测,但它提供了宏,让你检查对特定语言/编译器特性的支持。

rhfm7lfc

rhfm7lfc6#

__加加
在C0x中,宏__cplusplus将被设置为不同于(大于)当前199711L的值。
BS提供的C
0x常见问题解答

kupeojn6

kupeojn67#

按建议使用__cplusplus。Microsoft编译器只有一个注意事项,使用Zc:__cplusplus编译器开关启用__cplusplus
源代码https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/

rekjcdws

rekjcdws8#

quick google之后:
__STDC____STDC_VERSION__,参见here

相关问题