277 votes

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 ?

538voto

jilles de wit Points 5207

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

Voici quelques valeurs pour les versions les plus récentes du compilateur :

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 fait bien sûr référence à la version majeure de votre Visual Studio que vous voyez dans la boîte "about", et non à l'année dans le nom. Une liste complète peut être trouvée aquí . Depuis peu Visual Studio commencera à mettre à jour ses plages de manière 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
.....

43 votes

Désolé, mais pourquoi Microsoft ne rend pas cette information facile à trouver ? Ce poste est très utile mais ne devrait pas être obligatoire.

10 votes

Il semble que cette macro ne reflète pas la version du compilateur utilisée par le projet. Par exemple, si vous ouvrez un projet VS2010 dans une version plus récente sans mettre à jour le projet, cette macro ne reflète pas le compilateur utilisé - seulement la version de l'IDE.

1 votes

Je suis en train de compiler libFLAC avec d'autres bibliothèques. Elles nécessitent que la compilation soit faite en utilisant toolset v100. Il y a un code #if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h> . inttypes.h ne peut être trouvé, cependant. Très étrange

51voto

Keith Halligan Points 725

Oui, _MSC_VER est la macro qui vous donnera la version du compilateur. Les dernières versions de Visual C++ ont été de la forme suivante <compiler-major-version>.00.<build-number> où 00 est le numéro mineur. Donc _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'ont pas modifié l'adresse de l'utilisateur. compiler-minor-version Le code suivant n'est donc pas nécessaire :

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

L'accès à des informations plus détaillées sur les versions (telles que le numéro de compilation du compilateur) peut être obtenu en utilisant d'autres variables de préprocesseur intégrées. aquí .

0 votes

Il suffit de vérifier == 1500 dans ce cas.

0 votes

@José, il est vrai que nous pourrions simplifier la vérification pour VC++ 9 avec _MSC_VER_ == 1500 Cependant, si MS, a modifié le _MSC_VER avec les mises à jour de compilateurs, les Service Packs, etc. (je ne pense pas qu'ils l'aient jamais fait), alors la == 1500 Le chèque pourrait se briser. C'est pourquoi je l'ai codé de cette façon.

0 votes

__MSC_VER évaluent les composantes des numéros majeurs et mineurs de la version du compilateur. Cela ne changera pas avec une mise à jour, il y a _MSC_FULL_VER qui inclut aussi le numéro de build, mais je n'ai jamais eu besoin de l'utiliser.

11voto

DJ Capelis Points 601

_MSC_VER doit être défini comme un numéro de version spécifique. Vous pouvez soit #ifdef dessus, soit utiliser la définition actuelle et faire 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é ? Oui, vous cherchiez probablement le #ifdef. :))

9voto

Igor Semenov Points 1232

L'utilisation de macros spécifiques à Visual Studio permet d'obtenir plus d'informations. aquí .

7voto

Jeff Hubbard Points 5292

En utilisant le _MSC_VER macro.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X