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

257

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

Vhaerun
fuente

Respuestas:

516

_MSC_VERy posiblemente _MSC_FULL_VERes lo que necesitas. También puede examinar visualc.hpp en cualquier instalación de impulso reciente para ver algunos ejemplos de uso.

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

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)

El número de versión anterior, por supuesto, se refiere a la versión principal de su Visual Studio que ve en el cuadro acerca de, no al año en el nombre. Una lista completa se puede encontrar aquí . A partir de hace poco , Visual Studio comenzará a actualizar sus rangos monotónicamente, 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 utilizada, 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
.....
jilles de wit
fuente
36
Lo sentimos, pero ¿por qué Microsoft no hace que esta información sea fácil de encontrar? esta publicación es muy útil pero no debería ser obligatoria.
Chris
66
Parece que esta macro no refleja la versión del compilador utilizada por el proyecto. Es decir, si abre un proyecto VS2010 en una versión más nueva sin actualizar el proyecto, esta macro no refleja el compilador que se está utilizando, solo la versión IDE.
thomthom
Estoy en el proceso de compilar libFLAC junto con algunas otras bibliotecas. Requieren que la compilación se realice con el conjunto de herramientas v100. Hay un código #if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>. Sin embargo, inttypes.h no se puede encontrar. Muy extraño
Bernhard Döbler
1
@thomthom: esta macro refleja exactamente la versión del conjunto de herramientas utilizada por el objetivo seleccionado del proyecto de compilación. O más distinto: Proyecto-> Propiedades-> General-> Conjunto de herramientas de plataforma.
Yamakuzure
44
@chrisw Ahora documentamos esto en docs.microsoft.com/en-us/cpp/preprocessor/… , ver _MSC_VER . Espero que esto ayude
Sebastian
47

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

Puedes usar un 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

Parece que las actualizaciones entre lanzamientos sucesivos del compilador, no han modificado el compiler-minor-version, por lo que no se requiere el siguiente código:

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

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

display101
fuente
solo necesita verificar == 1500 en ese caso
José
@ José, es cierto, podríamos simplificarlo simplemente para verificar si hay VC ++ 9 _MSC_VER_ == 1500, sin embargo, si MS modificó las _MSC_VERactualizaciones del compilador, los paquetes de servicio, etc. (no creo que lo hayan hecho), entonces la == 1500verificación podría romperse. Es por eso que lo he codificado de esa manera.
display101
__MSC_VER evalúa los componentes de número mayor y menor de la versión del compilador. Esto no cambiará con una actualización, hay _MSC_FULL_VER con incluir el número de compilación también, nunca he necesitado usar eso.
José
Votaré la respuesta si la editas para aclarar esto. Bests Jose.
José
@ José: Respuesta actualizada para dar una respuesta más correcta y detallada.
display101
11

_MSC_VER debe definirse con 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. :))

DJ Capelis
fuente
7

Mediante el uso de la _MSC_VERmacro.

Jeff Hubbard
fuente
1

Esto es un poco viejo pero debería comenzar:

//******************************************************************************
// 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
Steve Fallows
fuente
Me gusta esta respuesta mucho más que la más votada. Porque _MSC_VER requiere que incluyas stdio.h
JMI MADISON
1
_MSC_VERno requiere que lo incluyas stdio.h, lo que se puede probar fácilmenteecho int i = _MSC_VER; > tmp.c cl /nologo /c tmp.c
Kevin Smyth
1
@JMIMADISON: No solo no es cierto con respecto a MSC_VER, que es una macro _predefinida , esta respuesta claramente no responde la pregunta: detecta la plataforma, no la versión de la versión del compilador.
Clifford
-11

En Visual Studio, ve a ayudar | sobre y mira la versión de Visual Studio que estás usando para compilar tu aplicación.

Hackeado
fuente
66
Esto no puede ser serio. Especialmente de alguien con una reputación como esta. ¿Asumo que estabas haciendo una broma?
BuvinJ
1
Creo que él acaba de interpretar la pregunta de una manera diferente. Después de todo, esta es una de las primeras respuestas a la pregunta.
Keith M
44
AFAIK @Haacked es válido y correcto, ya que la pregunta no incluye "de mi código" u otra declaración que indique que él / ella no está utilizando un IDE VS.
Alex Byrth