Wie erkenne ich, ob ich Code mit einer bestimmten Visual Studio-Version kompiliere?

257

Gibt es eine Möglichkeit festzustellen, ob ich unter einer bestimmten Microsoft Visual Studio-Version kompiliere?

Vhaerun
quelle

Antworten:

516

_MSC_VERund möglicherweise _MSC_FULL_VERist das, was Sie brauchen. Sie können visualc.hpp auch in jeder kürzlich durchgeführten Boost-Installation auf einige Verwendungsbeispiele untersuchen.

Einige Werte für die neueren Versionen des Compilers sind:

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)

Die obige Versionsnummer bezieht sich natürlich auf die Hauptversion Ihres Visual Studios, die Sie in der Info-Box sehen, nicht auf das Jahr im Namen. Eine ausführliche Liste finden Sie hier . Ab kürzlich aktualisiert Visual Studio seine Bereiche monoton. Dies bedeutet, dass Sie die Bereiche überprüfen sollten und nicht die genauen Compilerwerte.

cl.exe /? gibt einen Hinweis auf die verwendete Version, zB:

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
quelle
36
Entschuldigung, aber warum macht Microsoft es nicht einfach, diese Informationen zu finden? Dieser Beitrag ist sehr nützlich, sollte aber nicht benötigt werden.
Chrisw
6
Es scheint, dass dieses Makro nicht die vom Projekt verwendete Compilerversion widerspiegelt. Wenn Sie also ein VS2010-Projekt in einer neueren Version öffnen, ohne das Projekt zu aktualisieren, spiegelt dieses Makro nicht den verwendeten Compiler wider - nur die IDE-Version.
thomthom
Ich bin dabei, libFLAC zusammen mit einigen anderen Bibliotheken zu kompilieren. Sie erfordern die Kompilierung mit dem Toolset v100. Es gibt einen Code #if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>. inttypes.h kann jedoch nicht gefunden werden. Sehr seltsam
Bernhard Döbler
1
@thomthom: Dieses Makro spiegelt genau die Toolset-Version wider, die vom ausgewählten Ziel des Build-Projekts verwendet wird. Oder genauer: Projekt-> Eigenschaften-> Allgemein-> Plattform-Toolset.
Yamakuzure
4
@chrisw Wir dokumentieren dies jetzt unter docs.microsoft.com/en-us/cpp/preprocessor/… , siehe _MSC_VER . Hoffe das hilft
Sebastian
47

Yep _MSC_VER ist das Makro, mit dem Sie die Compilerversion erhalten. Die letzte Anzahl von Releases von Visual C ++ hatte die Form <compiler-major-version>.00.<build-number>, wobei 00 die untergeordnete Nummer ist. Also _MSC_VERwird zu bewerten <major-version><minor-version>.

Sie können folgenden Code verwenden:

#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

Es scheint, dass Aktualisierungen zwischen aufeinanderfolgenden Versionen des Compilers die nicht geändert haben compiler-minor-version, sodass der folgende Code nicht erforderlich ist:

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

Der Zugriff auf detailliertere Versionsinformationen (z. B. die Compiler-Build-Nummer) kann über andere integrierte Präprozessorvariablen hier erfolgen .

display101
quelle
Sie müssen nur == 1500 in diesem Fall überprüfen
José
@ José, stimmt, wir könnten es vereinfachen, nur nach VC ++ 9 zu _MSC_VER_ == 1500suchen. Wenn jedoch MS das _MSC_VERmit Compiler-Updates, Service Packs usw. geändert hat (ich glaube nicht, dass dies jemals der Fall war), könnte die Prüfung unterbrochen werden == 1500. Deshalb habe ich es so codiert.
Display101
__MSC_VER wird anhand der Haupt- und Nebenzahlkomponenten der Compilerversion ausgewertet. Dies wird sich mit einem Update nicht ändern. Es gibt _MSC_FULL_VER mit der Build-Nummer. Ich muss das nie verwenden.
José
Ich werde die Antwort abstimmen, wenn Sie sie bearbeiten, um dies zu klären. Bests Jose.
José
@ José: Antwort aktualisiert, um eine korrektere und detailliertere Antwort zu geben.
Anzeige 101
11

_MSC_VER sollte auf eine bestimmte Versionsnummer definiert sein. Sie können entweder #ifdef darauf verwenden oder die tatsächliche Definition verwenden und einen Laufzeit-Test durchführen. (Wenn Sie aus irgendeinem Grund einen anderen Code ausführen wollten, der darauf basiert, mit welchem ​​Compiler er kompiliert wurde? Ja, wahrscheinlich haben Sie nach dem #ifdef gesucht. :))

DJ Capelis
quelle
7

Mit dem _MSC_VERMakro.

Jeff Hubbard
quelle
1

Dies ist ein wenig alt, sollte aber Ihnen den Einstieg erleichtern:

//******************************************************************************
// 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
quelle
Ich mag diese Antwort viel mehr als die am besten gewählte. Weil _MSC_VER erfordert, dass Sie stdio.h
JMI MADISON
1
_MSC_VERerfordert nicht, dass Sie einschließen stdio.h, was leicht getestet werden kannecho int i = _MSC_VER; > tmp.c cl /nologo /c tmp.c
Kevin Smyth
1
@JMIMADISON: Dies gilt nicht nur nicht für MSC_VER, ein vordefiniertes Makro . Diese Antwort beantwortet die Frage eindeutig nicht - sie erkennt die Plattform und nicht die Version der Compilerversion.
Clifford
-11

Gehen Sie im Visual Studio zu Hilfe | Informationen zu der Version von Visual Studio, mit der Sie Ihre App kompilieren.

Gehackt
quelle
6
Das kann nicht ernst sein. Besonders von jemandem mit einem solchen Ruf. Ich nehme an, du hast nur einen Witz gemacht?
BuvinJ
1
Ich denke, er hat die Frage nur anders interpretiert. Immerhin ist dies eine der ersten Antworten auf die Frage.
Keith M
4
AFAIK @Haacked ist gültig und korrekt, da die Frage nicht "aus meinem Code" oder eine andere Aussage enthält, die besagt, dass er / sie noch keine VS-IDE verwendet.
Alex Byrth