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?

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
.....

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 .


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. :))




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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.