预定义宏的官方文档 在Visual C++中
这个博客是加布里埃尔·多斯雷斯和马克·莱文写的。
从VS“15”预览5开始,VisualC++团队单调地更新内置预处理器宏的值。 _MSC_VER
在每个VisualC++工具集更新中。
为什么?
由于VisualC++团队在ISO C++实现一致性领域的投资和进展,我们一直在传输新的语言特性,并以前所未有的速度引入新的一致性变化。 我们的客户,特别是对Visual C++工具集的更新。 因此,我们的客户有必要在他们的源代码中有一个好的方法来区分VC++的更新(而不仅仅是主要版本)。 例如,一个程序,希望利用C++ 11 No除了VC++以外的特征,通常会写:
#if _MSC_VER >= 1900// … use noexcept here …#endif
如何测试?
传统上,开发人员编写有条件包含的代码片段来测试内置预处理器宏的值 _MSC_VER
针对已知的VisualC++编译器的主要版本的值。例如,
_MSC_VER >= 1900
测试VS2015 RTM发布后的Visual C++编译器的任何版本。这仍然是我们的建议做法。我们正在做的是,从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。但是,一般来说,我们建议您使用“ >=
“并按降序排列测试。
寻找一组封闭的编译器版本
有些情况需要寻找一组封闭的编译器版本。例如,这个代码片段
#if _MSC_VER >= 1900 && _MSC_VER < 2000 “mspdb140.dll”#endif
包括字符串文字 “mspdb140.dll”
仅当编译器来自VS2015版本时。在这些情况下,您将使用“ >=
“和” <
“构造一个半开放的间隔来限定您感兴趣的发布系列。
我应该在什么时候使用u MSC u FULL u VER?
_MSC_FULL_VER
是内置预处理器宏的一个更细粒度的变体 _MSC_VER
它还包含编译器的内部版本号。当您想要区分同一更新的微更新时,可以使用此选项。到目前为止,它还被用来区分不同的更新。
你的建筑怎么样?
它是一个内置的预处理器宏,有文档记录 在这里 在大多数C或C++源代码中很少使用或需要。
编译器版本控制方案
VisualC++编译器的每个主要版本都增加了“数百”的 _MSC_VER
. 主要版本中的每次更新都会将“单位”增加1。例如,在VS“15”Preview 5中,宏 _MSC_VER
计算结果为1910。下一次更新将 _MSC_VER
设定为1911年。
请注意,VS“15”和VS2015都是VisualStudio的主要版本,具有不同的主要版本号。但是,所包含的编译器工具集将具有相同的主版本号–通过此处描述的更改,可以使用次版本号来区分编译器工具集。
行动号召
如果您有比较 _MSC_VER
使用相等运算符,再看一眼,看看上面解释的“较大”或“相等”运算符是否能更好地表达这种比较。