Respostas:
_MSC_VER
e 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
.....
#if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>
. O inttypes.h não pode ser encontrado. Muito estranho
_MSC_VER
. Espero que isso ajude
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 .
_MSC_VER_ == 1500
, no entanto, se a MS modificar o _MSC_VER
com atualizações do compilador, service packs, etc. (acho que nunca), a == 1500
verificação poderá ser interrompida. É por isso que codifiquei dessa maneira.
_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. :))
Usando a _MSC_VER
macro.
Como resposta mais geral, http://sourceforge.net/p/predef/wiki/Home/ mantém uma lista de macros para detectar compiladores, sistemas operacionais, arquiteturas, padrões e muito mais.
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
_MSC_VER
não requer que você inclua stdio.h
, que pode ser facilmente testadoecho int i = _MSC_VER; > tmp.c
cl /nologo /c tmp.c
No visual studio, vá para ajudar | sobre e veja a versão do Visual Studio que você está usando para compilar seu aplicativo.