15

我必须使用 MSVC2012 和 v100 平台工具集(来自 MSVC2010)构建项目。不幸的是,我在代码中使用了 C++11 特性“基于范围”。我想知道是否有一个预处理器指令允许在编译时了解当前平台工具集。IE

#if (_MSC_PLATFORM_TOOLSET > 100)
#   define ALLOW_RANGE_BASED_FOR 1
#else
#   define ALLOW_RANGE_BASED_FOR 0
#endif

我尝试使用_MSC_VER宏,但对于两个平台工具集,它都设置为 1700(这确实有意义,因为我仍在使用 MSVC2012)。我很感激任何建议。谢谢你。

4

4 回答 4

19

I encountered the same problem and added my own preprocessor definition for _MSC_PLATFORM_TOOLSET.
In the project properties in

  • C/C++
  • Preprocessor
  • Preprocessor Definitions

add _MSC_PLATFORM_TOOLSET=$(PlatformToolsetVersion) to make Visual Studio integrate the current Toolset's version to the preprocessor so that your query

#if (_MSC_PLATFORM_TOOLSET > 100)
...
#endif

will finally work.

于 2013-02-13T09:14:47.270 回答
10

每个平台工具集的宏_MSC_FULL_VER都不同;和 Visual Studio 的版本。对于(当前)Visual Studio 2013 预览版,它是180020617. 对于带有 2012 年 11 月编译器 CTP(提供了一些 C++11)的 Visual Studio 2012,它是170060315. 像 一样_MSC_VER,每个版本的 Visual Studio 的前 4 位数字都是相同的;对于 Visual Studio 2012,它们始终是1700. 这是一个例子:

#ifdef _MSC_FULL_VER
  #if   _MSC_FULL_VER == 170060315
  // MSVS 2012; Platform Toolset v110
  #elif _MSC_FULL_VER == 170051025
  // MSVS 2012; Platform Toolset v120_CTP_Nov2012
  #elif _MSC_FULL_VER == 180020617
  // MSVS 2013; Platform Toolset v120
  #endif
#endif // _MSC_FULL_VER
于 2013-07-29T19:23:59.043 回答
6

在使用 Visual Studio 开发 C 或 C++ 时,我实际上需要知道两个版本号。这些是 Visual Studio 主要版本号和“cl”编译器主要/次要版本。

Visual Studio 版本号显示在“关于”对话框中。例如,对于 VS2012,我看到“版本 11.0.60610.01”,所以主版本号是“11”。

bakefileCMake等构建工具将创建针对 Visual Studio 主要版本的解决方案文件。

编译器“主要/次要”版本是 _MSC_VER 宏的值。这是一个小程序,它会显示这个:

#include <stdio.h>
/*
 * Compile and run this on a Visual Studio platform to get
 * the version identifier.
 */
#define PRINT_INT_MACRO(m) (printf("%s: \"%d\"\n", #m, m))

int
main() {
    PRINT_INT_MACRO(_MSC_VER);
      return 0;
}

正如评论所说,您必须使用要测试的编译器实际编译它。为了省去你的麻烦,这里有一张小表:

名称版本_MSC_VER
对比 6 6.0 1200
对比 2002 7.0 1300
对比 2003 年 7.1 1310
与 2005 年相比 8.0 1400
与 2008 年相比 9.0 1500
对比 2010 10.0 1600
对比 2012 年 11.0 1700
对比 2013 年 12.0 1800
对比 2015 年 13.0 1900

希望这可以帮助!

于 2015-11-08T04:53:45.327 回答
2

我不知道他们是否在 VS2015 中修复了它,但它确实可以在那里按预期工作。

我创建了以下小程序:

#include <iostream>
using namespace std;

int main()
{
    cout << "_MSC_VER: " << _MSC_VER << endl;
    cout << "_MSC_FULL_VER: " << _MSC_FULL_VER << endl;
    cout << "_MSC_BUILD: " << _MSC_BUILD << endl;

    (void) getchar();

    return 0;
}

我为从 VS2010 到 VS2015 的每个平台版本添加了构建配置,并且 _MSC_VER 对应于上面的 PLATFORM 版本 - 尽管总是在 VS2015 项目中的 Visual Studio 2015 中构建它。

干杯,

伊恩

于 2016-09-06T13:51:58.337 回答