web-dev-qa-db-fra.com

Comment détecter si je compile du code avec une version particulière de Visual Studio?

Existe-t-il un moyen de savoir si je compile sous une version spécifique de Microsoft Visual Studio?

253
Vhaerun

_MSC_VER et éventuellement _MSC_FULL_VER est ce dont vous avez besoin. Vous pouvez également examiner visualc.hpp dans n'importe quelle installation boost récente pour certains exemples d'utilisation.

Certaines valeurs pour les versions les plus récentes du compilateur sont:

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)

Le numéro de version ci-dessus correspond bien sûr à la version majeure de votre Visual studio que vous voyez dans la zone à propos de, pas à l'année dans le nom. Une liste complète peut être trouvée ici . Commençant récemment , Visual Studio commencera à mettre à jour ses plages de manière monotone, ce qui signifie que vous devriez vérifier les plages plutôt que les valeurs exactes du compilateur.

cl.exe /? donnera un indice sur la version utilisée, par exemple:

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

Oui _MSC_VER est la macro qui vous donnera la version du compilateur. Le dernier nombre de versions de Visual C++ a été de la forme <compiler-major-version>.00.<build-number>, où 00 est le nombre mineur. Donc, _MSC_VER sera évalué à <major-version><minor-version>.

Vous pouvez utiliser un code comme ceci:

#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

Il semble que les mises à jour entre les versions successives du compilateur, n'ayant pas modifié le compiler-minor-version, le code suivant n'est donc pas requis:

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

L'accès à des informations de version plus détaillées (telles que le numéro de compilation du compilateur) peut être obtenu à l'aide d'autres variables de pré-processeur intégrées here .

43
display101

_MSC_VER doit être défini avec un numéro de version spécifique. Vous pouvez soit #ifdef dessus, soit utiliser la définition réelle et effectuer un test d’exécution. (Si, pour une raison quelconque, vous souhaitiez exécuter un code différent en fonction du compilateur avec lequel il avait été compilé? Oui, vous recherchiez probablement le #ifdef. :))

11
DJ Capelis

En utilisant la macro _MSC_VER.

6
Jeff Hubbard

En guise de réponse plus générale, http://sourceforge.net/p/predef/wiki/Home/ conserve une liste de macros permettant de détecter des compilateurs spécifiques, des systèmes d'exploitation, des architectures, des normes, etc.

3
Clifford

Ceci est un peu vieux mais devrait vous aider à démarrer:

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