it-swarm-es.tech

¿Cómo detectar si estoy compilando código con una versión particular de Visual Studio?

¿Hay alguna forma de saber si estoy compilando bajo una versión específica de Microsoft Visual Studio?

249
Vhaerun

_MSC_VER y posiblemente _MSC_FULL_VER es lo que necesita. También puede examinar visualc.hpp en cualquier instalación de impulso reciente para algunos ejemplos de uso.

Algunos valores para las versiones más recientes del compilador son:

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)

El número de versión anterior, por supuesto, se refiere a la versión principal de su estudio visual que ve en el cuadro acerca de, no al año en el nombre. Se puede encontrar una lista completa aquí . Comenzando recientemente , Visual Studio comenzará a actualizar sus rangos de forma monótona, lo que significa que debe verificar los rangos, en lugar de los valores exactos del compilador.

cl.exe /? dará una pista de la versión usada, por ejemplo:

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

Sí, _MSC_VER es la macro que te dará la versión del compilador. El último número de versiones de Visual C++ ha sido de la forma <compiler-major-version>.00.<build-number>, donde 00 es el número menor. Entonces _MSC_VER evaluará a <major-version><minor-version>.

Puedes usar código como este:

#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

Aparece actualizaciones entre versiones sucesivas del compilador, no se ha modificado el compiler-minor-version, por lo que no es necesario el siguiente código:

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

El acceso a información más detallada sobre las versiones (como el número de compilación del compilador) se puede encontrar utilizando otras variables de preprocesador integradas aquí .

42
display101

_MSC_VER se debe definir para un número de versión específico. Puede #ifdef en él, o puede usar la definición real y hacer una prueba de tiempo de ejecución. (¿Si por alguna razón quisieras ejecutar un código diferente según el compilador con el que se compiló? Sí, probablemente estabas buscando el #ifdef. :))

11
DJ Capelis

Usando la macro _MSC_VER.

6
Jeff Hubbard

Como respuesta más general http://sourceforge.net/p/predef/wiki/Home/ mantiene una lista de macros para detectar compiladores específicos, sistemas operativos, arquitecturas, estándares y más.

3
Clifford

Esto es un poco viejo pero debería empezar:

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