VC++ 编译器的版本

[原文发表地址]  VC++编译器的版本

[原文发表时间] 2016/10/05

从VS “15” preview 5开始,VC++团队在每一个VC++工具集的更新中都逐步更新内置预编译处理程序宏指令_MSC_VER的值。

为什么这么做?

多亏了VC++团队在ISO C++领域的实现做出的投入和取得的进展,我们已经迅速上线了客户从未见过的新的语言特征并且引进了新的一致性的更改,尤其是在VC++工具集的更新中。因此,客户需要在他们的源代码中用好的方法区分VC++(不只是主要的版本)的更新版本。例如,一个想要利用VC++的C++ 11 noexcept 操作符特征的程序通常要写:

#if _MSC_VER >=1900

// …use noexcept here …

#endif

怎么测试?

传统情况下,开发者编写有包含条件的代码片段测试内置预编译处理程序宏_MSC_VER的值和显示了VC++编译器主要发布版本的已知的值做对比。比如:

_MSC_VER >=1900

测试VC++编译器在VS2015 RTM之后的任意发布的版本。这一直是我们推荐的做法。从VS 15“开始,我们一直在做的目的是每一次更新都让_MSC_VER的值有一个增量。

在给定参照点之后测试VC++更新或者发布,请使用 “>=”(大于或者等于)操作符来对比_MSC_VER和已知的引用值。另外,如果你用有几个参考点在互斥的状态下比较,我们推荐你根据参照值降序排列的方式排列要对比的值。例如,以下代码片段

#if _MSC_VER >=1900

// …

#elif _MSC_VER >=1800

// …

#else

// …

#endif

查看VS2015之后发布的编译器,然后查看VS2013之后发布的编译器,然后查看VS2013之前的较早发布的编译器。

<的顺序测试

如果你选择用小于操作符(<),那么我们推荐你根据参照值升序的方式排列你的参考值。

检测一个指定的编译器版本

偶尔,你可能会找一个特定的VC++发布版本。只有在这种情况下,你需要用到==操作符来比较_MSC_VER和已知的值。这种情况包括在一个熟知的VC++版本上处理一个bug。然而,一般情况下,我们推荐你用”>=”来降序排列你的tests。

在一个封闭集合中查找编译器版本

某些情况下会要求查找一个封闭集合中的编译器版本。例如,这个代码片段

#if _MSC_VER >=1900 && _MSC_VER <1900

“mspdb140.dll”

#endif

只有在编译器是VS2015版本的情况下包含字符串文本“mspdb140.dll”。在这种情况下,你将要用到”>=”和”<”来构造一个半开放的区间来界定你有意查找的的发布系列。

我应该什么时候用 _MSC_FULL_VER? _MSC_FULL_VER是一个内置预编译处理程序宏_MSC_VER的更具体的变量,它也包含了编译器的版本号。当你想要区分同一个更新版本的微小的更新时,你就会用到这个。到目前为止,它已经同样被用来区分不同的更新版本。

_MSC_BUILD是什么?

它是一个内置的预处理器宏,记录在此处,在大多数C/C++ 源码中很少需要使用

编译器版本体系

每一个VC++编译器主要的发布版本成百的增加_MSC_VER的值。每一个在一个主要发布版本之内的更新会把units加1。例如,在VS”15” preview 5中,宏_MSC_VER的值达到了1910.下一次更新将会把_MSC_VER设置到1911.

注意VS“15”和VS2015都是不同主要版本号的Visual Studio主要发布版本。然而,包含的编译器工具集将有一样的主要版本号,与这里描述的更改,较小的版本号被用来区分编译器工具集。

行动号召

如果你已经有代码用等号操作符来比较_MSC_VER,再次查看一下比较操作是否可以用综上所述的大于或等于操作符来描述。