【问题标题】:Visual Studio: how to check used C++ platform toolset programmaticallyVisual Studio:如何以编程方式检查使用的 C++ 平台工具集
【发布时间】:2012-12-10 02:20:23
【问题描述】:

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

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

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

【问题讨论】:

    标签: visual-c++ preprocessor multiplatform


    【解决方案1】:

    我遇到了同样的问题并为_MSC_PLATFORM_TOOLSET添加了我自己的预处理器定义。
    在项目属性中

    • C/C++
    • 预处理器
    • 预处理器定义

    添加 _MSC_PLATFORM_TOOLSET=$(PlatformToolsetVersion) 以使 Visual Studio 将当前工具集的版本集成到预处理器中,以便您的查询

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

    最终会奏效。

    【讨论】:

    • +10。如果您需要支持不同的平台工具集,这是唯一正确的版本,例如如果 typedef 在 100 中定义,但不是在 90 中。
    【解决方案2】:

    每个平台工具集的宏_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
    

    【讨论】:

      【解决方案3】:

      在使用 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

      希望这会有所帮助!

      【讨论】:

      • 不,它没有。 _MSC_VER 是 IDE 的版本,而不是目标平台工具集的版本。你可以编译例如在 VS 2015 中使用 2010 编译器,通过指定“Platform Toolset = v100”
      • 注意:VS2015其实是14.0 ... 13.0被跳过了。
      【解决方案4】:

      我不知道他们是否在 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 中构建它。

      干杯,

      伊恩

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-14
        • 2017-07-28
        • 2019-08-15
        • 2013-03-05
        • 2016-04-26
        • 1970-01-01
        相关资源
        最近更新 更多