Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

__cplusplus 매크로로 컴파일러의 C++ 표준 버전 확인하는 방법

C++로 개발을 하다 보면 현재 컴파일러가 어떤 C++ 표준으로 동작하고 있는지 확인해야 할 때가 있습니다. 예를 들어 최신 문법(C++11 이후 기능)을 사용할 수 있는지 판단하거나, 여러 빌드 환경 간 호환성을 점검할 때 유용합니다.

이런 정보는 __cplusplus라는 사전 정의 매크로(predefined macro)를 통해 손쉽게 얻을 수 있습니다. 이 매크로는 컴파일 타임에 해당 C++ 표준에 맞는 값을 자동으로 가지며, 표준별 값은 아래와 같습니다.

표준__cplusplus 값
C++98 이전 (비표준 C++)1
C++98199711L
C++98 + TR1별도 확인 불가 (C++98과 동일하게 표시됨)
C++11201103L
C++14201402L
C++17201703L

예제 코드

아래 코드는 __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 같은 전처리기 지시문과 함께 조건부 컴파일에 활용하면 더욱 강력하게 사용할 수 있습니다.