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?

Vhaerun
źródło

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
.....
jilles de wit
źródło
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 .

display101
źródło
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. :))

DJ Capelis
źródło
7

Za pomocą _MSC_VERmakra.

Jeff Hubbard
źródło
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
Steve Fallows
źródło
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.

Haacked
źródło
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,