Подтвердить что ты не робот

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

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

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

Я попробовал использовать макрос _MSC_VER, но для обоих наборов инструментов на нем установлено значение 1700 (и это имеет смысл, потому что я все еще использую MSVC2012). Буду признателен за любое предложение. Спасибо.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

наконец, будет работать.

Ответ 3

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

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

Создайте такие инструменты, как bakefile или CMake создаст файлы решений, предназначенные для основной версии 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;
}

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

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

Надеюсь, это поможет!

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

Приветствия,

Ян