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


257

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

Réponses:


516

_MSC_VERet c'est peut _MSC_FULL_VER- être ce dont vous avez besoin. Vous pouvez également examiner visualc.hpp dans n'importe quelle installation récente de boost pour quelques exemples d'utilisation.

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

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)

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

cl.exe /? donnera un indice de 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
.....

36
Désolé, mais pourquoi Microsoft ne rend-il pas ces informations faciles à trouver? ce message est très utile mais ne devrait pas être requis.
chrisw

6
Il semble que cette macro ne reflète pas la version du compilateur utilisée par le projet. Autrement dit, si vous ouvrez un projet VS2010 dans une version plus récente sans mettre à niveau le projet, cette macro ne reflète pas le compilateur utilisé - uniquement la version IDE.
thomthom

Je suis en train de compiler libFLAC avec d'autres bibliothèques. Ils nécessitent une compilation à l'aide du jeu d'outils v100. Il y a un code #if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>. inttypes.h est cependant introuvable. Très étrange
Bernhard Döbler

1
@thomthom: cette macro reflète exactement la version de l'ensemble d'outils utilisée par la cible sélectionnée du projet de génération. Ou plus distinct: Project-> Properties-> General-> Platform Toolset.
Yamakuzure

4
@chrisw Nous documentons maintenant cela sur docs.microsoft.com/en-us/cpp/preprocessor/… , voir _MSC_VER . J'espère que cela vous aidera
Sebastian

47

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

Vous pouvez utiliser un code comme celui-ci:

#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'aient 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 trouvé à l'aide d'autres variables de pré-processeur intégrées ici .


il vous suffit de vérifier == 1500 dans ce cas
José

@ José, vrai que nous pourrions simplifier juste vérifier VC ++ 9 avec _MSC_VER_ == 1500, si MS, a fait modifier le _MSC_VERavec des mises à jour du compilateur, service packs, etc (je ne pense pas qu'ils aient jamais), le == 1500contrôle pourrait se briser. C'est pourquoi je l'ai codé de cette façon.
display101

__MSC_VER évalue les composants de nombre majeur et mineur de la version du compilateur. Cela ne changera pas avec une mise à jour, il y a _MSC_FULL_VER avec aussi le numéro de build, je n'ai jamais besoin de l'utiliser.
José

Je voterai positivement la réponse si vous la modifiez pour clarifier cela. Bests Jose.
José

@ José: Réponse mise à jour pour donner une réponse plus correcte et détaillée.
display101

11

_MSC_VER doit être défini sur 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 vouliez exécuter un code différent en fonction du compilateur avec lequel il a été compilé? Ouais, vous cherchiez probablement le #ifdef. :))




1

C'est un peu vieux mais ça 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

J'aime cette réponse beaucoup plus que la première votée. Parce que _MSC_VER nécessite que vous incluiez stdio.h
JMI MADISON

1
_MSC_VERne vous oblige pas à l'inclure stdio.h, ce qui peut être facilement testéecho int i = _MSC_VER; > tmp.c cl /nologo /c tmp.c
Kevin Smyth

1
@JMIMADISON: Non seulement ce n'est pas vrai en ce qui concerne MSC_VER qui est une macro _prédéfinie , cette réponse ne répond clairement pas à la question - elle détecte la plate-forme, pas la version de la version du compilateur.
Clifford

-11

Dans Visual Studio, accédez à l'aide | à propos et regardez la version de Visual Studio que vous utilisez pour compiler votre application.


6
Ça ne peut pas être sérieux. Surtout de quelqu'un avec une réputation comme celle-ci. Je suppose que tu faisais juste une blague?
BuvinJ

1
Je pense qu'il vient d'interpréter la question d'une manière différente. Après tout, c'est l'une des premières réponses à la question.
Keith M

4
AFAIK @Haacked est valide et correct, car la question n'inclut pas "de mon code" ou autre déclaration indiquant qu'il / elle n'utilise pas déjà un VS IDE.
Alex Byrth
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.