如何确定编译器实现的C ++标准版本?据我所知,以下是我所知道的标准:
答案 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
中期望的价值:
__cplusplus
是1
。__cplusplus
是199711L
。__cplusplus
是201103L
。__cplusplus
是201402L
。__cplusplus
是201703L
。如果编译器可能是较旧的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不同(大于)的值。
答案 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