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


257

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

답변:


516

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

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

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)

위의 버전 번호는 이름의 연도가 아닌 정보 상자에 표시되는 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
.....

36
죄송하지만 Microsoft가이 정보를 쉽게 찾을 수없는 이유는 무엇입니까? 이 게시물은 매우 유용하지만 필수는 아닙니다.
— chrisw

6
이 매크로는 프로젝트에서 사용하는 컴파일러 버전을 반영하지 않는 것 같습니다. 즉, 프로젝트를 업그레이드하지 않고 최신 버전으로 VS2010 프로젝트를 열면이 매크로는 사용중인 컴파일러를 반영하지 않으며 IDE 버전 만 반영합니다.
— thomthom

libFLAC를 다른 라이브러리와 함께 컴파일하는 과정에 있습니다. 툴셋 v100을 사용하여 컴파일해야합니다. 코드가 #if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>있습니다. 그래도 inttypes.h를 찾을 수 없습니다. 매우 이상하다
— Bernhard Döbler

1
@thomthom :이 매크로는 선택된 빌드 프로젝트의 타겟이 사용하는 툴셋 버전을 정확하게 반영합니다. 또는 더 뚜렷한 : 프로젝트-> 속성-> 일반-> 플랫폼 툴셋.
— Yamakuzure

4
@chrisw 이제 docs.microsoft.com/en-us/cpp/preprocessor/…에 문서화 되어 있습니다 _MSC_VER . 도움이
— Sebastian

47

네 _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

(예컨대 컴파일러 빌드 번호)보다 상세한 버전 정보에 대한 액세스는 다른 내장 용 전처리 변수를 사용하여 발견 될 수있다 여기 .


이 경우 == 1500 만 확인하면됩니다.
— José

@ José, 우리는을 사용하여 VC ++ 9를 확인하기 위해 단순화 할 수 _MSC_VER_ == 1500있지만, MS _MSC_VER가 컴파일러 업데이트, 서비스 팩 등으로 수정 한 경우 (필자는 생각하지 않습니다) == 1500검사가 중단 될 수 있습니다. 그렇기 때문에 내가 그렇게 코딩했습니다.
— display101

__MSC_VER는 컴파일러 버전의 주요 및 부 구성 요소로 평가됩니다. 이것은 업데이트로 변경되지 않으며 빌드 번호도 포함 된 _MSC_FULL_VER이 있으며, 사용할 필요가 없습니다.
— José

이것을 명확히하기 위해 편집하면 답변을 투표 할 것입니다. 최고의 호세.
— José

@ José :보다 정확하고 자세한 답변을 제공하도록 답변이 업데이트되었습니다.
— display101

11

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




1

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

//******************************************************************************
// 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에서는 stdio.h를 포함해야하므로
— JMI MADISON

1
_MSC_VERstdio.h쉽게 테스트 할 수있는 포함하지 않아도됩니다echo int i = _MSC_VER; > tmp.c cl /nologo /c tmp.c
— Kevin Smyth

1
@ JMIMADISON : _predefined 매크로 인 MSC_VER 에 관해서는 사실이 아니며 ,이 답변은 분명히 질문에 대답하지 않습니다-컴파일러 버전 버전이 아닌 플랫폼을 감지합니다.
— Clifford

-11

Visual Studio에서 도움말로 이동 | 앱을 컴파일하는 데 사용하는 Visual Studio 버전을 살펴보십시오.


6
이것은 심각 할 수 없습니다. 특히 이런 평판을 가진 사람에게서. 난 당신이 농담을하고 있다고 가정?
— BuvinJ

1
나는 그가 질문을 다른 방식으로 해석했다고 생각합니다. 결국, 이것은 질문에 대한 첫 번째 답변 중 하나입니다.
— Keith M

4
AFAIK @Haacked는 "내 코드에서"또는 아직 VS IDE를 사용하고 있지 않다는 다른 진술을 포함하지 않으므로 유효하고 정확합니다.
— Alex Byrth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.