Come rilevare se sto compilando il codice con una particolare versione di Visual Studio?


257

C'è un modo per sapere se sto compilando con una versione specifica di Microsoft Visual Studio?

Risposte:


516

_MSC_VERe forse _MSC_FULL_VERè quello che ti serve. Puoi anche esaminare visualc.hpp in qualsiasi recente installazione boost per alcuni esempi di utilizzo.

Alcuni valori per le versioni più recenti del compilatore sono:

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)

Il numero di versione sopra, ovviamente, si riferisce alla versione principale di Visual Studio che vedi nella casella about, non all'anno nel nome. Un elenco completo può essere trovato qui . A partire da poco , Visual Studio inizierà ad aggiornare i suoi intervalli monotonicamente, il che significa che è necessario controllare gli intervalli, anziché i valori esatti del compilatore.

cl.exe /? darà un suggerimento della versione utilizzata, ad esempio:

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
Siamo spiacenti, ma perché Microsoft non rende queste informazioni facili da trovare? questo post è molto utile ma non dovrebbe essere richiesto.
chrisw,

6
Sembra che questa macro non rifletta la versione del compilatore utilizzata dal progetto. Vale a dire se si apre un progetto VS2010 in una versione più recente senza aggiornare il progetto questa macro non riflette il compilatore in uso - solo la versione IDE.
Thom

Sono in procinto di compilare libFLAC insieme ad alcune altre librerie. Richiedono che la compilazione venga eseguita utilizzando il set di strumenti v100. C'è un codice #if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>. inttypes.h non può essere trovato, però. Molto strano
Bernhard Döbler il

1
@thomthom: questa macro riflette esattamente la versione del set di strumenti utilizzata dalla destinazione selezionata del progetto di compilazione. O più distinti: Progetto-> Proprietà-> Generale-> Set di strumenti della piattaforma.
Yamakuzure,

4
@chrisw Ora lo documentiamo su docs.microsoft.com/en-us/cpp/preprocessor/… , vedi _MSC_VER . Spero che questo aiuti
Sebastian

47

Sì _MSC_VER è la macro che ti darà la versione del compilatore. L'ultimo numero di versioni di Visual C ++ è stato nel formato <compiler-major-version>.00.<build-number>, dove 00 è il numero minore. Quindi _MSC_VERvaluterà a <major-version><minor-version>.

Puoi usare il codice in questo modo:

#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

Sembra aggiornamenti tra versioni successive del compilatore, non hanno modificato il compiler-minor-version, quindi il seguente codice non è richiesto:

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

L'accesso a informazioni più dettagliate sulla versione (come il numero di build del compilatore) può essere trovato utilizzando altre variabili pre-processore integrate qui .


devi solo controllare == 1500 in quel caso
José,

@ José, vero, potremmo semplificarlo per controllare solo VC ++ 9 con _MSC_VER_ == 1500, tuttavia se MS, ha modificato gli _MSC_VERaggiornamenti del compilatore, i service pack, ecc. (Non credo che lo abbiano mai fatto), il == 1500controllo potrebbe interrompersi. Ecco perché l'ho codificato in quel modo.
display101

__MSC_VER valuta i componenti del numero maggiore e minore della versione del compilatore. Questo non cambierà con un aggiornamento, c'è _MSC_FULL_VER con include anche il numero di build, non ho mai avuto bisogno di usarlo.
José

Voterò la risposta se la modifichi per chiarire questo. Bests Jose.
José

@ José: risposta aggiornata per fornire una risposta più corretta e dettagliata.
display101

11

_MSC_VER deve essere definito con un numero di versione specifico. Puoi #ifdef su di esso, oppure puoi usare la definizione effettiva ed eseguire un test di runtime. (Se per qualche motivo volessi eseguire codice diverso in base al compilatore con cui è stato compilato? Sì, probabilmente stavi cercando #ifdef. :))




1

Questo è un po 'vecchio ma dovresti iniziare:

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

Mi piace questa risposta molto più di quella più votata. Perché _MSC_VER richiede di includere stdio.h
JMI MADISON il

1
_MSC_VERnon richiede di includere stdio.h, che può essere facilmente testatoecho int i = _MSC_VER; > tmp.c cl /nologo /c tmp.c
Kevin Smyth il

1
@JMIMADISON: Non solo non è vero riguardo a MSC_VER che è una macro predefinita , questa risposta chiaramente non risponde alla domanda, ma rileva la piattaforma, non la versione della versione del compilatore.
Clifford,

-11

In Visual Studio, vai ad aiutare | e guarda la versione di Visual Studio che stai utilizzando per compilare la tua app.


6
Questo non può essere serio. Soprattutto da qualcuno con una reputazione come questa. Suppongo che stavi solo scherzando?
BuvinJ,

1
Penso che abbia appena interpretato la domanda in modo diverso. Dopotutto, questa è una delle prime risposte alla domanda.
Keith M

4
AFAIK @Haacked è valido e corretto, poiché la domanda non include "dal mio codice" o altre dichiarazioni che affermano che non sta già utilizzando un IDE VS.
Alex Byrth,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.