Visual Studio: как программно проверить используемый набор инструментов платформы C++

Я должен построить проект, используя MSVC2012 и набор инструментов платформы v100 (из MSVC2010). К сожалению, я использую функцию C++11"

4 ответов


макрос _MSC_FULL_VER отличается для каждой группы инструментов платформы; и версии Visual Studio. Для (текущего) предварительного просмотра Visual Studio 2013 это 180020617. Для Visual Studio 2012 с ноябрьским компилятором CTP 2012 (который дал некоторые C++11), это было 170060315. Как _MSC_VER, первые 4 цифры одинаковы для каждой версии Visual Studio; для 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

я столкнулся с той же проблемой и добавил свое собственное определение препроцессора для _MSC_PLATFORM_TOOLSET.
В свойствах проекта в

  • C / C++
  • препроцессора
  • Определения Препроцессора

добавить _MSC_PLATFORM_TOOLSET=$(PlatformToolsetVersion) чтобы Visual Studio интегрировала версию текущего набора инструментов в препроцессор, чтобы ваш запрос

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

наконец-то сработает.


есть два номера версий, которые мне действительно нужно знать при разработке C или C++ с Visual Studio. Это основной номер версии Visual Studio и основная/вспомогательная версия компилятора" cl".

номер версии Visual Studio отображается в диалоговом окне "О программе". Например, для VS2012 я вижу "версию 11.0.60610.01", поэтому основным номером версии является"11".

построить инструменты, такие как bakefile или CMake создать файлы решения предназначен для основной версии Visual Studio.

версия компилятора "major / minor" - это значение макроса _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;
}

как говорится в комментарии, вы должны фактически скомпилировать его с помощью компилятора, который вы хотите тестировать. Чтобы избавить вас от хлопот, вот маленький столик:

Name    Version  _MSC_VER
VS 6        6.0      1200
VS 2002     7.0      1300
VS 2003     7.1      1310
VS 2005     8.0      1400
VS 2008     9.0      1500
VS 2010    10.0      1600
VS 2012    11.0      1700
VS 2013    12.0      1800
VS 2015    13.0      1900

надеюсь, что это помогает!


Я не знаю, исправили ли они его в 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 соответствовал версии платформы, как указано выше, несмотря на то, что всегда создавал ее в Visual Studio 2015 в проекте VS2015.

спасибо,

Иэн