it-swarm-ko.tech

특정 Visual Studio 버전으로 코드를 컴파일하는지 감지하는 방법은 무엇입니까?

특정 Microsoft Visual Studio 버전에서 컴파일하고 있는지 알 수있는 방법이 있습니까?

253
Vhaerun

_MSC_VER 그리고 아마도 _MSC_FULL_VER이 필요합니다. 사용 예를 보려면 최근 부스트 설치에서 visualc.hpp를 검사 할 수도 있습니다.

최신 버전의 컴파일러에 대한 일부 값은 다음과 같습니다.

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)

위의 버전 번호는 이름의 연도가 아닌 정보 상자에 표시되는 Visual Studio의 주요 버전을 나타냅니다. 전체 목록을 찾을 수 있습니다 여기 . 최근 시작 , Visual Studio는 범위를 단조롭게 업데이트하기 시작합니다. 즉, 정확한 컴파일러 값이 아니라 범위를 확인해야합니다.

cl.exe /?는 사용 된 버전에 대한 힌트를 제공합니다. 예 :

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

네 _MSC_VER는 컴파일러 버전을 제공하는 매크로입니다. Visual C++의 마지막 릴리스 수는 <compiler-major-version>.00.<build-number> 형식이며 00은 부 숫자입니다. 따라서 _MSC_VER<major-version><minor-version>로 평가됩니다.

다음과 같은 코드를 사용할 수 있습니다.

#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

컴파일러의 연속 릴리스간에 업데이트가 나타나고 compiler-minor-version를 수정하지 않았으므로 다음 코드는 필요하지 않습니다.

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

다른 내장 프리 프로세서 변수 here 를 사용하면보다 자세한 버전 정보 (예 : 컴파일러 빌드 번호)에 액세스 할 수 있습니다.

43
display101

_MSC_VER는 특정 버전 번호로 정의해야합니다. #ifdef를 사용하거나 실제 정의를 사용하여 런타임 테스트를 수행 할 수 있습니다. (어떤 이유로 컴파일 된 컴파일러에 따라 다른 코드를 실행하고 싶습니까? 예, 아마도 #ifdef를 찾고 있었을 것입니다. :))

11
DJ Capelis

_MSC_VER 매크로를 사용합니다.

6
Jeff Hubbard

보다 일반적인 대답으로 http://sourceforge.net/p/predef/wiki/Home/ 는 특정 컴파일러, 운영 체제, 아키텍처, 표준 등을 감지하기위한 매크로 목록을 유지 관리합니다.

3
Clifford

이것은 조금 낡았지만 시작해야합니다.

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