Як визначити, якщо я компілюю код з певною версією Visual Studio?


257

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

Відповіді:


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 студії, яку ви бачите в полі 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
.....

36
Вибачте, але чому Microsoft не полегшує пошук цієї інформації? ця публікація дуже корисна, але її не потрібно вимагати.
chrisw

6
Схоже, цей макрос не відображає версію компілятора, яку використовує проект. Тобто, якщо ви відкриєте проект VS2010 в новій версії без оновлення проекту, цей макрос не відображає використовуваний компілятор - лише версію IDE.
1616

Я зараз працюю над libFLAC разом з деякими іншими бібліотеками. Вони вимагають компіляції здійснювати за допомогою набору інструментів v100. Там є код #if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>. inttypes.h не можна знайти. Дуже дивно
Бернхард Дьоблер

1
@thomthom: Цей макрос точно відображає версію набору інструментів, використовувану вибраною ціллю проекту збирання. Або більш чітко: Проект-> Властивості-> Загальне-> Набір інструментів платформи.
Ямакузуре

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

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


вам потрібно лише перевірити == 1500 в такому випадку
Хосе

@ Хосе, правда, ми могли б спростити його, щоб просто перевірити наявність VC ++ 9 _MSC_VER_ == 1500, однак якщо MS не _MSC_VERзмінила оновлення компілятора, пакети послуг тощо (я не думаю, що вони коли-небудь були), то == 1500перевірка може зламатися. Ось чому я так зашифрував це.
показ101

__MSC_VER оцінити до основних та другорядних компонентів версії компілятора. Це не зміниться з оновленням, є _MSC_FULL_VER з включити номер збірки теж, мені ніколи не потрібно цим користуватися.
Жозе

Я буду голосувати за відповідь, якщо ви її відредагуєте, щоб уточнити це. Бест Хосе.
Хосе

@ Хосе: Відповідь оновлено, щоб дати більш правильну і детальну відповідь.
показ101

11

_MSC_VER слід визначити до конкретного номера версії. Ви можете або #ifdef на ньому, або ви можете використовувати фактичне визначення та зробити тест виконання. (Якщо ви чомусь хотіли запустити інший код залежно від того, з якого компілятора він був складений? Так, напевно, ви шукали #ifdef. :))




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, яку ви використовуєте для складання програми.


6
Це не може бути серйозним. Особливо від когось із такою репутацією. Я припускаю, що ви просто жартували?
BuvinJ

1
Я думаю, що він просто трактував питання по-іншому. Зрештою, це одна з перших відповідей на питання.
Кіт М

4
AFAIK @Haacked є дійсним і правильним, оскільки питання не включає "з мого коду" або інше твердження про те, що він / вона вже не використовує VS IDE.
Alex Byrth
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.