C++는 언어 버전에 따라 지원하는 기능이 달라집니다. 당신이 라이브러리를 작성하거나 사용하는 경우라고 해봅시다. 지원할 버전이 특정한 경우라면 별 문제 없이 해당 버전의 스펙에 따라 작성하면 됩니다만, 여러 버전을 지원할 경우(대표적인 예로 STL과 같은 범용적인 라이브러리가 있습니다.) 언어 버전별로 작성할 코드가 달라집니다. 자, 그럼 MSVC 버전으로 조건부 컴파일을 수행하는 방법에 대한 간략하게 알아봅시다.
C++ 버전 확인하기
Visual studio에서 C++ 버전은 Predefined Macros
에서 _MSVC_LANG
로 알 수 있습니다. 우선 C++ 버전은 아래와 같이 정해져있습니다.
C++ version | C++98 | C++11 | C++14 | C++17 |
---|---|---|---|---|
199711L | 201103L | 201402L | 201703L |
버전별 표준이 승인된 년, 월에 해당합니다. 그러면 다음과 같이 버전을 매크로로 정의할 수 있겠군요.
1
2
3
4
5
6
7
#ifndef C_XX_VERSION
#define C_XX_VERSION _MSVC_LANG
#define C_XX_11_BEFORE 199711L
#define C_XX_11_AFTER 201103L
#define C_XX_14_AFTER 201402L
#define C_XX_17_AFTER 201703L
#endif // !C_XX_VERSION
조건부 컴파일하기
예를 들기 위해 간단한 가정을 해봅시다. 저희는 어떤 라이브러리를 작성중이며 C++14와 C++17을 지원하고 있습니다. 지원하는 기능은 같으나 구현은 언어에 따라 달라져야 한다고 할 때 어떻게 해야할까요. (C++ 버전이 안맞는 경우 에러가 발생하도록 하였습니다.)
1
2
3
4
5
6
7
#if C_XX_VERSION > C_XX_14_AFTER // c++14 이후(c++17 이상)인 경우
// C++17으로 작성된 코드
#elif C_XX_VERSION > C_XX_11_AFTER // c++11 이후(c++14 이상)인 경우
// C++14로 작성된 코드
#else
#error C++ compiler version is low(must after C++14)
#endif
언어 버전 뿐만이 아니라 여러 조건들로도 조건부 컴파일이 가능하다는 점을 기억합시다.