it-swarm.it

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

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

250
Vhaerun

_MSC_VER e possibilmente _MSC_FULL_VER è ciò di cui hai bisogno. 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.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. È possibile trovare un elenco completo qui . A partire da poco , Visual Studio inizierà ad aggiornare i suoi intervalli in modo monotonico, il che significa che è necessario controllare gli intervalli, anziché i valori esatti del compilatore.

cl.exe /? fornirà un suggerimento sulla versione utilizzata, ad es .:

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
.....
504
jilles de wit

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_VER valuterà in <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

Appare aggiornamenti tra le 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 .

42
display101

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

11
DJ Capelis

Utilizzando la macro _MSC_VER.

6
Jeff Hubbard

Come risposta più generale http://sourceforge.net/p/predef/wiki/Home/ mantiene un elenco di macro per il rilevamento di compilatori, sistemi operativi, architetture, standard e altro ancora.

3
Clifford

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
1
Rob Basler