특정 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.