it-swarm-pt.tech

Como detectar se estou compilando código com uma versão específica do Visual Studio?

Existe alguma maneira de saber se estou compilando em uma versão específica do Microsoft Visual Studio?

250
Vhaerun

_MSC_VER e possivelmente _MSC_FULL_VER é o que você precisa. Você também pode examinar o visualc.hpp em qualquer instalação recente do boost para alguns exemplos de uso.

Alguns valores para as versões mais recentes do compilador são:

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)

O número da versão acima, é claro, refere-se à versão principal do seu Visual Studio que você vê na caixa sobre, não ao ano no nome. Uma lista completa pode ser encontrada aqui . Iniciando recentemente , o Visual Studio começará a atualizar seus intervalos monotonicamente, o que significa que você deve verificar os intervalos, em vez dos valores exatos do compilador.

cl.exe /? fornecerá uma sugestão da versão usada, por exemplo:

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

Sim _MSC_VER é a macro que te dará a versão do compilador. O último número de versões do Visual C++ tem o formato <compiler-major-version>.00.<build-number>, onde 00 é o número menor. Então _MSC_VER será avaliado como <major-version><minor-version>.

Você pode 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

Aparecem atualizações entre lançamentos sucessivos do compilador, não modificaram o compiler-minor-version, então o seguinte código não é necessário:

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

O acesso a informações de versão mais detalhadas (como o número de compilação do compilador) pode ser encontrado usando outras variáveis ​​de pré-processador incorporadas aqui .

42
display101

_MSC_VER deve ser definido para um número de versão específico. Você pode ou #ifdef nele, ou você pode usar o real definir e fazer um teste de tempo de execução. (Se por algum motivo você quisesse rodar código diferente baseado em qual compilador foi compilado? Sim, provavelmente você estava procurando pelo #ifdef. :))

11
DJ Capelis

Usando a macro _MSC_VER.

6
Jeff Hubbard

Como uma resposta mais geral http://sourceforge.net/p/predef/wiki/Home/ mantém uma lista de macros para detectar compiladores específicos, sistemas operacionais, arquiteturas, padrões e muito mais.

3
Clifford

Isso é um pouco antigo, mas você deve começar:

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