Как определить, компилирую ли я код с определенной версией Visual Studio?

257

Есть ли способ узнать, компилирую ли я под определенную версию Microsoft Visual Studio?

Vhaerun
источник

Ответы:

516

_MSC_VERи, возможно, _MSC_FULL_VERэто то, что вам нужно. Вы также можете проверить visualc.hpp в любой недавней установке для некоторых примеров использования.

Некоторые значения для более поздних версий компилятора:

MSVC++ 14.24 _MSC_VER == 1924 (Visual Studio 2019 version 16.4)
MSVC++ 14.23 _MSC_VER == 1923 (Visual Studio 2019 version 16.3)
MSVC++ 14.22 _MSC_VER == 1922 (Visual Studio 2019 version 16.2)
MSVC++ 14.21 _MSC_VER == 1921 (Visual Studio 2019 version 16.1)
MSVC++ 14.2  _MSC_VER == 1920 (Visual Studio 2019 version 16.0)
MSVC++ 14.16 _MSC_VER == 1916 (Visual Studio 2017 version 15.9)
MSVC++ 14.15 _MSC_VER == 1915 (Visual Studio 2017 version 15.8)
MSVC++ 14.14 _MSC_VER == 1914 (Visual Studio 2017 version 15.7)
MSVC++ 14.13 _MSC_VER == 1913 (Visual Studio 2017 version 15.6)
MSVC++ 14.12 _MSC_VER == 1912 (Visual Studio 2017 version 15.5)
MSVC++ 14.11 _MSC_VER == 1911 (Visual Studio 2017 version 15.3)
MSVC++ 14.1  _MSC_VER == 1910 (Visual Studio 2017 version 15.0)
MSVC++ 14.0  _MSC_VER == 1900 (Visual Studio 2015 version 14.0)
MSVC++ 12.0  _MSC_VER == 1800 (Visual Studio 2013 version 12.0)
MSVC++ 11.0  _MSC_VER == 1700 (Visual Studio 2012 version 11.0)
MSVC++ 10.0  _MSC_VER == 1600 (Visual Studio 2010 version 10.0)
MSVC++ 9.0   _MSC_FULL_VER == 150030729 (Visual Studio 2008, SP1)
MSVC++ 9.0   _MSC_VER == 1500 (Visual Studio 2008 version 9.0)
MSVC++ 8.0   _MSC_VER == 1400 (Visual Studio 2005 version 8.0)
MSVC++ 7.1   _MSC_VER == 1310 (Visual Studio .NET 2003 version 7.1)
MSVC++ 7.0   _MSC_VER == 1300 (Visual Studio .NET 2002 version 7.0)
MSVC++ 6.0   _MSC_VER == 1200 (Visual Studio 6.0 version 6.0)
MSVC++ 5.0   _MSC_VER == 1100 (Visual Studio 97 version 5.0)

Номер версии выше, конечно, относится к основной версии вашей Visual Studio, которую вы видите в поле about, а не к году в названии. Подробный список можно найти здесь . Начиная с недавнего времени , Visual Studio начнет монотонно обновлять свои диапазоны, то есть вы должны проверять диапазоны, а не точные значения компилятора.

cl.exe /? даст подсказку об используемой версии, например:

c:\program files (x86)\microsoft visual studio 11.0\vc\bin>cl /?
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.50727.1 for x86
.....
jilles de wit
источник
36
Извините, но почему Microsoft не облегчает поиск этой информации? Этот пост очень полезен, но не обязателен.
Chrisw
6
Похоже, что этот макрос не отражает версию компилятора, используемую проектом. Т.е., если вы откроете проект VS2010 в более новой версии без обновления проекта, этот макрос не отражает используемый компилятор - только версию IDE.
thomthom
Я нахожусь в процессе компиляции libFLAC вместе с некоторыми другими библиотеками. Они требуют компиляции с использованием набора инструментов v100. Там есть код #if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>. inttypes.h не может быть найден, хотя. Очень странно
Бернхард Доблер
1
@thomthom: этот макрос точно отражает версию набора инструментов, используемую выбранной целью проекта сборки. Или более четко: Project-> Properties-> General-> Platform Toolset.
Yamakuzure
4
@chrisw Теперь мы документируем это по адресу docs.microsoft.com/en-us/cpp/preprocessor/… , см _MSC_VER . Надеюсь, это поможет
Себастьян
47

Да, _MSC_VER - это макрос, который даст вам версию компилятора. Последнее число выпусков Visual C ++ было в форме <compiler-major-version>.00.<build-number>, где 00 - младший номер. Так _MSC_VERчто оценим <major-version><minor-version>.

Вы можете использовать код как это:

#if (_MSC_VER == 1500)
   // ... Do VC9/Visual Studio 2008 specific stuff
#elif (_MSC_VER == 1600)
   // ... Do VC10/Visual Studio 2010 specific stuff
#elif (_MSC_VER == 1700)
   // ... Do VC11/Visual Studio 2012 specific stuff
#endif

Похоже, что обновления между последовательными выпусками компилятора не были изменены compiler-minor-version, поэтому следующий код не требуется:

#if (_MSC_VER >= 1500 && _MSC_VER <= 1600)
   // ... Do VC9/Visual Studio 2008 specific stuff
#endif

Доступ к более подробной информации о версии (например, компилятор номер сборки) можно найти , используя другие переменные встроенный препроцессор здесь .

display101
источник
вам просто нужно проверить == 1500 в этом случае
Хосе
@ Хосе, правда, мы могли бы упростить его, чтобы просто проверить VC ++ 9 _MSC_VER_ == 1500, однако, если MS действительно изменила _MSC_VERобновления с помощью компилятора, пакеты обновления и т. Д. (Я не думаю, что они когда-либо имели), тогда == 1500проверка может прерваться. Вот почему я так закодировал.
display101
__MSC_VER оценивает компоненты старшего и младшего номеров версии компилятора. Это не изменится с обновлением, есть _MSC_FULL_VER с включенным номером сборки тоже, мне никогда не нужно это использовать.
Хосе
Я проголосую за ответ, если вы отредактируете его, чтобы уточнить это. Лучше жозе.
Хосе
@ Хосе: Ответ обновлен, чтобы дать более правильный и подробный ответ.
display101
11

_MSC_VER должен быть определен для определенного номера версии. Вы можете либо использовать #ifdef, либо использовать фактическое определение и выполнить тест во время выполнения. (Если по какой-то причине вы хотели запустить другой код в зависимости от того, с каким компилятором он был скомпилирован? Да, возможно, вы искали #ifdef. :))

DJ Capelis
источник
7

С помощью _MSC_VERмакроса.

Джефф Хаббард
источник
4

В качестве более общего ответа http://sourceforge.net/p/predef/wiki/Home/ содержит список макросов для обнаружения конкретных компиляторов, операционных систем, архитектур, стандартов и многого другого.

Клиффорд
источник
1

Это немного старый, но вы должны начать:

//******************************************************************************
// Automated platform detection
//******************************************************************************

// _WIN32 is used by
// Visual C++
#ifdef _WIN32
#define __NT__
#endif

// Define __MAC__ platform indicator
#ifdef macintosh
#define __MAC__
#endif

// Define __OSX__ platform indicator
#ifdef __APPLE__
#define __OSX__
#endif

// Define __WIN16__ platform indicator 
#ifdef _Windows_
#ifndef __NT__
#define __WIN16__
#endif
#endif

// Define Windows CE platform indicator
#ifdef WIN32_PLATFORM_HPCPRO
#define __WINCE__
#endif

#if (_WIN32_WCE == 300) // for Pocket PC
#define __POCKETPC__
#define __WINCE__
//#if (_WIN32_WCE == 211) // for Palm-size PC 2.11 (Wyvern)
//#if (_WIN32_WCE == 201) // for Palm-size PC 2.01 (Gryphon)  
//#ifdef WIN32_PLATFORM_HPC2000 // for H/PC 2000 (Galileo)
#endif
Стив Фэллоуз
источник
Мне нравится этот ответ намного больше, чем один из лучших проголосовавших. Потому что _MSC_VER требует, чтобы вы включили stdio.h
JMI MADISON
1
_MSC_VERне требует от вас включения stdio.h, что легко проверяетсяecho int i = _MSC_VER; > tmp.c cl /nologo /c tmp.c
Кевин Смит,
1
@JMIMADISON: Мало того, что MSC_VER, который является предопределенным макросом , не соответствует действительности , этот ответ явно не отвечает на вопрос - он определяет платформу, а не версию компилятора.
Клиффорд,
-11

В визуальной студии иди, чтобы помочь | о и посмотрите на версию Visual Studio, которую вы используете для компиляции вашего приложения.

Haacked
источник
6
Это не может быть серьезно. Особенно от человека с такой репутацией. Я полагаю, вы просто пошутили?
BuvinJ
1
Я думаю, что он просто интерпретировал вопрос по-другому. Ведь это один из первых ответов на вопрос.
Кит М
4
AFAIK @Haacked является действительным и правильным, так как вопрос не включает «из моего кода» или другого утверждения о том, что он / она еще не использует VS IDE.
Алекс Берт