Risposte:
_MSC_VER
e 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
.....
#if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>
. inttypes.h non può essere trovato, però. Molto strano
_MSC_VER
. Spero che questo aiuti
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à 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 .
_MSC_VER_ == 1500
, tuttavia se MS, ha modificato gli _MSC_VER
aggiornamenti del compilatore, i service pack, ecc. (Non credo che lo abbiano mai fatto), il == 1500
controllo potrebbe interrompersi. Ecco perché l'ho codificato in quel modo.
_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. :))
Usando la _MSC_VER
macro.
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.
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
_MSC_VER
non richiede di includere stdio.h
, che può essere facilmente testatoecho int i = _MSC_VER; > tmp.c
cl /nologo /c tmp.c
In Visual Studio, vai ad aiutare | e guarda la versione di Visual Studio che stai utilizzando per compilare la tua app.