Jak wykryć, czy kompiluję kod z określoną wersją programu Visual Studio?


257

Czy jest jakiś sposób, aby wiedzieć, czy kompiluję pod określoną wersją Microsoft Visual Studio?

Odpowiedzi:


516

_MSC_VERi być może _MSC_FULL_VERjest to, czego potrzebujesz. Możesz także sprawdzić visualc.hpp w dowolnej niedawnej instalacji doładowania dla niektórych przykładów użycia.

Niektóre wartości dla nowszych wersji kompilatora to:

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)

Powyższy numer wersji odnosi się oczywiście do głównej wersji Twojego programu Visual Studio widocznej w polu „about”, a nie do nazwy roku. Dokładna lista znajduje się tutaj . Od niedawna Visual Studio zacznie monotonnie aktualizować swoje zakresy, co oznacza, że ​​powinieneś sprawdzać zakresy, a nie dokładne wartości kompilatora.

cl.exe /? poda podpowiedź do używanej wersji, np .:

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
Przepraszamy, ale dlaczego Microsoft nie ułatwia znalezienia tych informacji? ten post jest bardzo przydatny, ale nie powinien być wymagany.
Chris

6
Wygląda na to, że to makro nie odzwierciedla wersji kompilatora używanej przez projekt. To znaczy, jeśli otworzysz projekt VS2010 w nowszej wersji bez uaktualnienia projektu, to makro nie odzwierciedla używanego kompilatora - tylko wersję IDE.
thomthom,

Jestem w trakcie kompilacji libFLAC wraz z kilkoma innymi bibliotekami. Wymagają kompilacji do wykonania przy użyciu zestawu narzędzi v100. Jest kod #if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>. Nie można jednak znaleźć inttypes.h. Bardzo dziwne
Bernhard Döbler,

1
@ thomthom: To makro dokładnie odzwierciedla wersję zestawu narzędzi używaną przez wybrany cel projektu kompilacji. Lub bardziej wyraźnie: Projekt-> Właściwości-> Ogólne-> Zestaw narzędzi platformy.
Yamakuzure

4
@chrisw Dokumentujemy to teraz na docs.microsoft.com/en-us/cpp/preprocessor/… , patrz _MSC_VER . Mam nadzieję, że to pomoże
Sebastian

47

Tak _MSC_VER to makro, które dostanie wersję kompilatora. Ostatnia liczba wydań Visual C ++ ma formę <compiler-major-version>.00.<build-number>, gdzie 00 jest liczbą mniejszą. Tak _MSC_VERoceni do <major-version><minor-version>.

Możesz użyć takiego kodu:

#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

Wydaje się, że aktualizacje między kolejnymi wydaniami kompilatora nie zostały zmodyfikowane compiler-minor-version, więc następujący kod nie jest wymagany:

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

Dostęp do bardziej szczegółowych informacji o wersji (takich jak numer kompilacji kompilatora) można znaleźć za pomocą innych wbudowanych zmiennych preprocesora tutaj .


wystarczy sprawdzić == 1500 w takim przypadku
José

@ José, prawda, możemy uprościć to po prostu sprawdzając VC ++ 9 za pomocą _MSC_VER_ == 1500, jednak jeśli MS zmodyfikuje _MSC_VERaktualizacje kompilatora, dodatki Service Pack itp. (Nie sądzę, by kiedykolwiek miały), wtedy == 1500sprawdzenie może się zepsuć. Właśnie dlatego tak to zakodowałem.
display101

__MSC_VER ocenia na główne i podrzędne numery składników wersji kompilatora. Nie zmieni się to wraz z aktualizacją, jest też _MSC_FULL_VER z dołączonym numerem kompilacji, nigdy nie musiałem jej używać.
José

Podniosę głosowanie nad odpowiedzią, jeśli ją wyedytujesz, aby to wyjaśnić. Bests Jose.
José

@ José: Odpowiedź została zaktualizowana, aby dać bardziej poprawną i szczegółową odpowiedź.
display101

11

_MSC_VER należy zdefiniować dla określonego numeru wersji. Możesz na nim #ifdef lub użyć rzeczywistej definicji i wykonać test czasu wykonywania. (Jeśli z jakiegoś powodu chciałeś uruchomić inny kod w oparciu o kompilator, z którym został skompilowany? Tak, prawdopodobnie szukałeś #ifdef. :))




1

To jest trochę stary, ale powinien zacząć:

//******************************************************************************
// 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

Bardzo podoba mi się ta odpowiedź niż ta, która została najwyżej oceniona. Ponieważ _MSC_VER wymaga dołączenia stdio.h
JMI MADISON

1
_MSC_VERnie wymaga dołączania stdio.h, co można łatwo przetestowaćecho int i = _MSC_VER; > tmp.c cl /nologo /c tmp.c
Kevin Smyth,

1
@JMIMADISON: Nie tylko nie jest to prawdą w przypadku MSC_VER, który jest makrem predefiniowanym , ale odpowiedź ta wyraźnie nie odpowiada na pytanie - wykrywa platformę, a nie wersję kompilatora.
Clifford,

-11

W studiu wizualnym przejdź do pomocy | i zobacz wersję programu Visual Studio, której używasz do kompilowania aplikacji.


6
To nie może być poważne. Zwłaszcza od kogoś o takiej reputacji. Zakładam, że żartujesz?
BuvinJ

1
Myślę, że po prostu zinterpretował to pytanie w inny sposób. W końcu jest to jedna z pierwszych odpowiedzi na pytanie.
Keith M

4
AFAIK @Haacked jest poprawny i poprawny, ponieważ pytanie nie zawiera „z mojego kodu” ani innych stwierdzeń mówiących, że on / ona nie używa już VS IDE.
Alex Byrth,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.