您如何确定编译器实现了哪个版本的C ++标准?据我所知,以下是我所知道的标准:
- C ++ 03
- C ++ 98
c++-faq
标签没有必须通过的任何实际的前提条件“要求的次数”;它更多地是关于事物的格式和一般性。
您如何确定编译器实现了哪个版本的C ++标准?据我所知,以下是我所知道的标准:
c++-faq
标签没有必须通过的任何实际的前提条件“要求的次数”;它更多地是关于事物的格式和一般性。
Answers:
据我所知,没有整体方法可以做到这一点。如果您查看跨平台/多个编译器支持库的标头,您将总会发现许多使用编译器特定的结构来确定此类内容的定义:
/*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常见问题解答:
__cplusplus
在C ++ 0x中,宏
__cplusplus
将被设置为不同于(大于)current的值199711L
。
尽管这并不像人们希望的那样有用。gcc
(显然是将近10年)将此值设置为1
,排除了一个主要的编译器,直到在gcc 4.7.0出现时被固定。
这些是C ++标准,您应该期望得到什么价值__cplusplus
:
__cplusplus
是1
。__cplusplus
是199711L
。__cplusplus
是201103L
。__cplusplus
是201402L
。__cplusplus
是201703L
。如果编译器可能较旧gcc
,则需要诉诸于编译器特定的黑客(查看版本宏,将其与具有已实现功能的表进行比较)或使用Boost.Config(提供相关宏))。这样做的好处是我们实际上可以选择新标准的特定功能,如果缺少该功能,则可以编写解决方法。这通常比批发解决方案更可取,因为某些编译器会声称实现C ++ 11,但仅提供部分功能。
Stdcxx Wiki拥有用于C ++ 0x功能的编译器支持的全面矩阵(如果您敢亲自检查这些功能)。
不幸的是,std::copy_if
只能在您的应用程序的构建系统中进行更细粒度的功能检查(例如像单个库功能)(运行带有该功能的代码,检查其是否编译并产生正确的结果- autoconf
如果采用这条路线)。
__cplusplus
仅在VS 15.7中得到部分修复。请参阅他们的Visual C ++团队博客
请运行以下代码以检查版本。
#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";
}
/Zc:__cplusplus
)
/Zc:__cplusplus
标志。我不能简单地std::cout << /Zc:__cplusplus;
因为冒号和斜杠当然不能成为变量名的一部分。您能解释如何执行此操作吗?谢谢。
根据您要实现的目标,Boost.Config可能会为您提供帮助。它不提供对标准版本的检测,但是提供了宏,可让您检查对特定语言/编译器功能的支持。
__cplusplus
在C ++ 0x中,宏__cplusplus的值将设置为不同于(大于)当前的199711L。
__cplusplus
按照建议使用。对于Microsoft编译器只有一个注释,请使用Zc:__cplusplus
编译器开关启用__cplusplus
资源 https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
通常,您应该使用__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