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

257

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

Vhaerun
fonte

Respostas:

516

_MSC_VERe possivelmente _MSC_FULL_VERé o que você precisa. Você também pode examinar o visualc.hpp em qualquer instalação de impulso recente para obter alguns exemplos de uso.

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

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)

O número da versão acima, obviamente, refere-se à versão principal do Visual Studio que você vê na caixa sobre, e não ao ano no nome. Uma lista completa pode ser encontrada aqui . A partir de 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 /? dará uma dica 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
.....
jilles de wit
fonte
36
Desculpe, mas por que a Microsoft não facilita a localização dessas informações? esta postagem é muito útil, mas não deve ser necessária.
Chrisw #
6
Parece que essa macro não reflete a versão do compilador usada pelo projeto. Ou seja, se você abrir um projeto do VS2010 em uma versão mais recente sem atualizar o projeto, essa macro não reflete o compilador sendo usado - apenas a versão do IDE.
Thomthom 10/02
Estou no processo de compilar o libFLAC junto com algumas outras bibliotecas. Eles exigem que a compilação seja feita usando o conjunto de ferramentas v100. Existe um código #if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>. O inttypes.h não pode ser encontrado. Muito estranho
Bernhard Döbler
1
@ thomthom: Essa macro reflete exatamente a versão do conjunto de ferramentas usada pelo destino selecionado do projeto de construção. Ou mais distinto: Projeto-> Propriedades-> Geral-> Conjunto de Ferramentas da Plataforma.
Yamakuzure
4
@chrisw Agora, documentamos isso em docs.microsoft.com/en-us/cpp/preprocessor/… , consulte _MSC_VER . Espero que isso ajude
Sebastian
47

Sim _MSC_VER é a macro que fornece 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, avaliará para <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

Parece que as atualizações entre versões sucessivas do compilador não modificaram o compiler-minor-version, portanto, o código a seguir não é necessário:

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

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

display101
fonte
você só precisa checar == 1500 nesse caso #
José
@ José, é verdade que poderíamos simplificá-lo para verificar apenas o VC ++ 9 com _MSC_VER_ == 1500, no entanto, se a MS modificar o _MSC_VERcom atualizações do compilador, service packs, etc. (acho que nunca), a == 1500verificação poderá ser interrompida. É por isso que codifiquei dessa maneira.
precisa
__MSC_VER avalie os componentes de número maior e menor da versão do compilador. Isso não vai mudar com uma atualização, existe _MSC_FULL_VER com o número da compilação também, eu nunca preciso usar isso.
José
Votarei a resposta se você a editar para esclarecer isso. Jose.
José
@ José: Resposta atualizada para fornecer uma resposta mais correta e detalhada.
display101
11

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

DJ Capelis
fonte
7

Usando a _MSC_VERmacro.

Jeff Hubbard
fonte
1

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
Steve Fallows
fonte
Eu gosto muito mais desta resposta do que a que mais votou. Porque _MSC_VER requer que você incluir stdio.h
JMI MADISON
1
_MSC_VERnão requer que você inclua stdio.h, que pode ser facilmente testadoecho int i = _MSC_VER; > tmp.c cl /nologo /c tmp.c
Kevin Smyth
1
@JMIMADISON: Não apenas não é verdade em relação ao MSC_VER, que é uma macro predefinida , mas esta resposta claramente não responde à pergunta - ele detecta a plataforma, não a versão da versão do compilador.
Clifford
-11

No visual studio, vá para ajudar | sobre e veja a versão do Visual Studio que você está usando para compilar seu aplicativo.

Haacked
fonte
6
Isso não pode ser sério. Especialmente de alguém com uma reputação como essa. Eu suponho que você estava apenas fazendo uma piada?
precisa saber é o seguinte
1
Eu acho que ele apenas interpretou a pergunta de uma maneira diferente. Afinal, esta é uma das primeiras respostas à pergunta.
Keith M
4
O AFAIK @Haacked é válido e correto, pois a pergunta não inclui "do meu código" ou outra declaração informando que ele / ela ainda não está usando um VS IDE.
Alex Byrth #