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

时间:2010-02-24 08:46:38

标签: c++ standards

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

  • C ++ 03
  • C ++ 98

8 个答案:

答案 0 :(得分:194)

来自Bjarne Stroustrup C++0x FAQ

  

__cplusplus

     

在C ++ 0x中,宏__cplusplus将被设置为不同的值   from(大于)当前199711L

虽然这不像人们想的那样有用。 gcc(显然近10年)将此值设置为1,排除了一个主要编译器,直到it was fixed when gcc 4.7.0 came out

这些是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(查看版本宏,将其与具有已实现功能的表进行比较)或使用Boost.Config(提供relevant macros)。这样做的好处是我们实际上可以选择新标准的特定功能,并在缺少该功能时编写解决方法。这通常比批发解决方案更受欢迎,因为一些编译器会声称实现C ++ 11,但只提供一部分功能。

Stdcxx Wiki主持comprehensive matrix for compiler support of C++0x features(如果您敢于自己检查功能)。

不幸的是,更精细的功能检查(例如单个库函数,如std::copy_if)只能在应用程序的构建系统中完成(运行具有该功能的代码,检查它是否已编译并生成正确的结果 - 如果采用这条路线,autoconf是首选工具。)

答案 1 :(得分:11)

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

#include<iostream>

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

答案 2 :(得分:8)

据我所知,没有全面的方法可以做到这一点。如果你看一下跨平台/多个编译器支持库的标题,你总会找到很多的定义,这些定义使用编译器特定的结构来确定这些:

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

您可能必须自己为您使用的所有编译器执行此类定义。

答案 3 :(得分:6)

根据您希望实现的目标,Boost.Config可能会对您有所帮助。它不提供标准版本的检测,但它提供了允许您检查特定语言/编译器功能支持的宏。

答案 4 :(得分:3)

  

__ CPLUSPLUS

     

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

C++0x FAQ by BS

答案 5 :(得分:2)

按照建议使用__cplusplus。 对于Microsoft编译器,只有一个注释,请使用Zc:__cplusplus编译器开关来启用__cplusplus

来源https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/

答案 6 :(得分:2)

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

/Zc:__cplusplus

答案 7 :(得分:1)

quick google之后:

__STDC____STDC_VERSION__,请参阅here