C++로 개발을 하다 보면 현재 컴파일러가 어떤 C++ 표준으로 동작하고 있는지 확인해야 할 때가 있습니다. 예를 들어 최신 문법(C++11 이후 기능)을 사용할 수 있는지 판단하거나, 여러 빌드 환경 간 호환성을 점검할 때 유용합니다.
이런 정보는 __cplusplus라는 사전 정의 매크로(predefined macro)를 통해 손쉽게 얻을 수 있습니다. 이 매크로는 컴파일 타임에 해당 C++ 표준에 맞는 값을 자동으로 가지며, 표준별 값은 아래와 같습니다.
| 표준 | __cplusplus 값 |
|---|---|
| C++98 이전 (비표준 C++) | 1 |
| C++98 | 199711L |
| C++98 + TR1 | 별도 확인 불가 (C++98과 동일하게 표시됨) |
| C++11 | 201103L |
| C++14 | 201402L |
| C++17 | 201703L |
예제 코드
아래 코드는 __cplusplus 매크로의 값을 비교하여 현재 적용된 C++ 표준을 출력하는 전처리기 조건문 예제입니다.
#include <iostream>
int main() {
if (__cplusplus == 201703L)
std::cout << "C++17" << std::endl;
else if (__cplusplus == 201402L)
std::cout << "C++14" << std::endl;
else if (__cplusplus == 201103L)
std::cout << "C++11" << std::endl;
else if (__cplusplus == 199711L)
std::cout << "C++98" << std::endl;
else
std::cout << "pre-standard C++" << std::endl;
}
실행 결과
C++98
위 실행 결과는 컴파일러가 별도의 옵션 없이 빌드되었을 때 기본값인 C++98(199711L)로 인식되었음을 의미합니다.
참고 사항
- GCC나 Clang에서는
-std=c++17같은 컴파일 옵션을 지정하면__cplusplus값이 그에 맞게 변경됩니다. - MSVC(Visual Studio)는 하위 호환성 문제로 기본적으로
__cplusplus가 199711L로 고정되어 있습니다. 올바른 값을 얻으려면/Zc:__cplusplus컴파일러 옵션을 추가해야 합니다. - 이 매크로는 런타임이 아니라 컴파일 시점에 평가되므로,
#if,#elif같은 전처리기 지시문과 함께 조건부 컴파일에 활용하면 더욱 강력하게 사용할 수 있습니다.