MSVC에 미리 정의된 매크로(predefined macro)가 여러개 있는데 그 중 _MSC_VER를 알아보겠습니다.

(참고 링크: 마이크로소프트 docs)

당연히 표준 매크로는 아니고요 MSVC에만 정의되어 있습니다. MSVC에서 _MSC_VER는 항상 정의되어 있습니다.

 

 

MSC    1.0   _MSC_VER == 100
MSC    2.0   _MSC_VER == 200
MSC    3.0   _MSC_VER == 300
MSC    4.0   _MSC_VER == 400
MSC    5.0   _MSC_VER == 500
MSC    6.0   _MSC_VER == 600
MSC    7.0   _MSC_VER == 700
MSVC++ 1.0   _MSC_VER == 800
MSVC++ 2.0   _MSC_VER == 900
MSVC++ 4.0   _MSC_VER == 1000 (Developer Studio 4.0)
MSVC++ 4.2   _MSC_VER == 1020 (Developer Studio 4.2)
MSVC++ 5.0   _MSC_VER == 1100 (Visual Studio 97 version 5.0)
MSVC++ 6.0   _MSC_VER == 1200 (Visual Studio 6.0 version 6.0)
MSVC++ 7.0   _MSC_VER == 1300 (Visual Studio .NET 2002 version 7.0)
MSVC++ 7.1   _MSC_VER == 1310 (Visual Studio .NET 2003 version 7.1)
MSVC++ 8.0   _MSC_VER == 1400 (Visual Studio 2005 version 8.0)
MSVC++ 9.0   _MSC_VER == 1500 (Visual Studio 2008 version 9.0)
MSVC++ 10.0  _MSC_VER == 1600 (Visual Studio 2010 version 10.0)
MSVC++ 11.0  _MSC_VER == 1700 (Visual Studio 2012 version 11.0)
MSVC++ 12.0  _MSC_VER == 1800 (Visual Studio 2013 version 12.0)
MSVC++ 14.0  _MSC_VER == 1900 (Visual Studio 2015 version 14.0)
MSVC++ 14.1  _MSC_VER == 1910 (Visual Studio 2017 version 15.0)
MSVC++ 14.11 _MSC_VER == 1911 (Visual Studio 2017 version 15.3)
MSVC++ 14.12 _MSC_VER == 1912 (Visual Studio 2017 version 15.5)
MSVC++ 14.13 _MSC_VER == 1913 (Visual Studio 2017 version 15.6)
MSVC++ 14.14 _MSC_VER == 1914 (Visual Studio 2017 version 15.7)
MSVC++ 14.15 _MSC_VER == 1915 (Visual Studio 2017 version 15.8)
MSVC++ 14.16 _MSC_VER == 1916 (Visual Studio 2017 version 15.9)
MSVC++ 14.2  _MSC_VER == 1920 (Visual Studio 2019 Version 16.0)
MSVC++ 14.21 _MSC_VER == 1921 (Visual Studio 2019 Version 16.1)
MSVC++ 14.22 _MSC_VER == 1922 (Visual Studio 2019 Version 16.2)
MSVC++ 14.23 _MSC_VER == 1923 (Visual Studio 2019 Version 16.3)
MSVC++ 14.24 _MSC_VER == 1924 (Visual Studio 2019 Version 16.4)
MSVC++ 14.25 _MSC_VER == 1925 (Visual Studio 2019 Version 16.5)
MSVC++ 14.26 _MSC_VER == 1926 (Visual Studio 2019 Version 16.6)

_MSC_VER는 정수 리터럴로, 버전에 따라 _MSC_VER의 값이 달라집니다.

복잡합니다. 숫자 하나만 달랑 주면 뭔지 모르겠습니다. 이렇게 룩업테이블을 봐야지만 알 수 있습니다.

그리고 좀 헷갈립니다. MSVC++14인데 왜 _MSC_VER는 19xx인 것인가.. 이게 다 시작부터 꼬여서 그렇습니다. MSVC++ 1.0때부터 1000을 쓰든가 했으면 좋지 않았을까요?

 

Microsoft C/C++ compiler 15.00.20706.01

_MSC_VER == 1500
_MSC_FULL_VER == 150020706
_MSC_BUILD == 1

_MSC_FULL_VER도 존재하는데 _MSC_VER 뒤에 빌드넘버를 추가한 형태입니다. 예를 들어 MSVC 15.00.20706.01이면 맨 뒤에 01은 떼고 _MSC_FULL_VER == 150020706입니다.

_MSC_BUILD는 MSVC 버전의 맨 뒤 리비전 넘버(revision number)를 나타냅니다. 00이면 0, 01이면 1 이런 식입니다.

 

 

#if _MSC_VER >= 1910
// . . .
#elif _MSC_VER >= 1900
// . . .
#else
// . . .
#endif

_MSC_VER 매크로를 사용해 이런식으로 컴파일러 버전별로 이것저것 다르게 구현할 수 있습니다.

 

 

Fig 1. <boost/hana/config.hpp>

boost/hana 파일 중 하나인데요 컴파일러를 감지해서 c++14 지원이 안되는 경우를 거르는 용도로 쓴 모습입니다.

반응형