다음을 통해 공유


미리 정의된 매크로

Microsoft C/C++ 컴파일러(MSVC)는 언어(C 또는 C++), 컴파일 대상 및 선택한 컴파일러 옵션에 따라 특정 전처리기 매크로를 미리 정의합니다.

MSVC는 ANSI/ISO C99, C11 및 C17 표준 및 ISO C++14, C++17 및 C++20 표준에 필요한 미리 정의된 전처리기 매크로를 지원합니다. 이 구현에서는 여러 추가 Microsoft 전용 전처리기 매크로도 지원합니다.

일부 매크로는 특정 빌드 환경 또는 컴파일러 옵션의 경우에만 정의됩니다. 별도로 명시된 경우가 아니면 매크로는 /D 컴파일러 옵션 인수로 지정된 것처럼 변환 단위 전체에서 정의됩니다. 정의된 경우 전처리기는 컴파일 전에 지정된 값을 매크로로 확장합니다. 미리 정의된 매크로는 인수를 사용하지 않으며 다시 정의할 수 없습니다.

미리 정의된 표준 식별자

컴파일러는 ISO C99 및 ISO C++11에 지정된 아래의 미리 정의된 식별자를 지원합니다.

  • __func__ 바깥쪽 함수의 정규화되지 않은 있는 그대로의 이름으로, char의 로컬 정적 생성자 배열로 된 함수입니다.

    void example()
    {
        printf("%s\n", __func__);
    } // prints "example"
    

미리 정의된 표준 매크로

컴파일러는 ISO C99, C11, C17 및 ISO C++17 표준에 지정된 아래의 미리 정의된 매크로를 지원합니다.

  • __cplusplus 변환 단위가 C++로 컴파일되는 경우 정수 리터럴 값으로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • __DATE__ 현재 소스 파일의 컴파일 날짜입니다. 날짜는 Mmm dd yyyy 형식의 상수 길이 문자열 리터럴입니다. 월 이름 Mmm은 CRT(C 런타임 라이브러리) asctime 함수에서 생성된 약식 월 이름과 동일합니다. 값이 10 미만인 경우 날짜 dd의 첫 문자는 공백입니다. 이 매크로는 항상 정의됩니다.

  • __FILE__ 현재 소스 파일의 이름입니다. __FILE__는 문자열 리터럴로 확장됩니다. 파일의 전체 경로를 표시하려면 /FC(진단 소스 코드 파일의 전체 경로)를 사용합니다. 이 매크로는 항상 정의됩니다.

  • __LINE__ 현재 소스 파일의 정수 줄 번호로 정의됩니다. 이 매크로의 값은 지시문을 사용하여 #line 변경할 수 있습니다. 값 __LINE__ 의 정수 계열 형식은 컨텍스트에 따라 달라질 수 있습니다. 이 매크로는 항상 정의됩니다.

  • __STDC__ C로 컴파일되고 컴파일러 옵션이 지정된 경우 /Za 1로 정의됩니다. Visual Studio 2022 버전 17.2부터는 C로 컴파일될 때와 컴파일러 옵션이 지정된 경우 /std:c11 /std:c17 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • __STDC_HOSTED__ 구현이 전체 필수 표준 라이브러리를 지원하는 ‘호스트된 구현’인 경우 1로 정의됩니다. 그 이외의 경우에는 0으로 정의됩니다.

  • __STDC_NO_ATOMICS__ 구현이 선택적 표준 원자성을 지원하지 않는 경우 1로 정의됩니다. MSVC 구현은 C로 컴파일되고 /std C11 또는 C17 옵션 중 하나가 지정되는 경우 1로 정의됩니다.

  • __STDC_NO_COMPLEX__ 구현이 선택적 표준 복소수를 지원하지 않는 경우 1로 정의됩니다. MSVC 구현은 C로 컴파일되고 /std C11 또는 C17 옵션 중 하나가 지정되는 경우 1로 정의됩니다.

  • __STDC_NO_THREADS__ 구현이 선택적 표준 스레드를 지원하지 않는 경우 1로 정의됩니다. MSVC 구현은 C로 컴파일되고 /std C11 또는 C17 옵션 중 하나가 지정되는 경우 1로 정의됩니다.

  • __STDC_NO_VLA__ 구현이 표준 가변 길이 배열을 지원하지 않는 경우 1로 정의됩니다. MSVC 구현은 C로 컴파일되고 /std C11 또는 C17 옵션 중 하나가 지정되는 경우 1로 정의됩니다.

  • __STDC_VERSION__ C로 컴파일되고 /std C11 또는 C17 옵션 중 하나가 지정되는 경우 정의됩니다. 201112L로 확장(/std:c11의 경우)되거나 201710L로 확장(/std:c17의 경우)됩니다.

  • __STDCPP_DEFAULT_NEW_ALIGNMENT__/std:c17 지정하거나 나중에 지정하면 이 매크로는 맞춤을 인식하지 않는 operator new호출에 의해 보장되는 맞춤 값이 있는 리터럴로 확장 size_t 됩니다. 더 큰 맞춤은 맞춤 인식 오버로드(예: .)에 operator new(std::size_t, std::align_val_t)전달됩니다. 자세한 내용은 (C++17 과잉 정렬 할당)을 참조 /Zc:alignedNew 하세요.

  • __STDCPP_THREADS__ 프로그램에 실행 스레드가 두 개 이상 포함될 수 있으며 C++로 컴파일되는 경우에만 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • __TIME__ 전처리된 변환 단위를 변환하는 시간입니다. 시간은 hh:mm:ss 형식의 문자열 리터럴로, CRT asctime 함수에서 반환하는 시간과 동일합니다. 이 매크로는 항상 정의됩니다.

Microsoft 전용 미리 정의된 매크로

MSVC는 다른 미리 정의된 매크로를 지원합니다.

  • __ARM_ARCH ARM 아키텍처 버전을 나타내는 정수 리터럴로 정의됩니다. 값은 Armv8-A 아키텍처에 대해 8로 정의됩니다. 8.1 이상에서는 ARM C 언어 확장에 정의된 수식 X * 100 + Y를 사용하여 X.Y와 같은 부 버전에 대해 값의 크기를 조정합니다. 예를 들어 Armv8.1 __ARM_ARCH 의 경우 8 * 100 + 1 또는 801입니다. ARM 아키텍처 버전을 설정하려면 다음을 참조하세요 /arch (ARM64). 이 매크로는 Visual Studio 2022 버전 17.10에서 도입되었습니다.

  • __ATOM__ /favor:ATOM 컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는 x64인 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • __AVX__또는 /arch:AVX2/arch:AVX512 컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는 /arch:AVX10.1 x64일 때 /arch:AVX1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • __AVX2__또는 /arch:AVX512 컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는 /arch:AVX10.1 x64일 때 /arch:AVX21로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • __AVX512BW__ /arch:AVX512 또는 /arch:AVX10.1 컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는 x64인 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • __AVX512CD__ /arch:AVX512 또는 /arch:AVX10.1 컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는 x64인 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • __AVX512DQ__ /arch:AVX512 또는 /arch:AVX10.1 컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는 x64인 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • __AVX512F__ /arch:AVX512 또는 /arch:AVX10.1 컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는 x64인 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • __AVX512VL__ /arch:AVX512 또는 /arch:AVX10.1 컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는 x64인 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • __AVX10_VER__ 컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는 x64일 때 /arch:AVX10.1 AVX10 버전을 나타내는 정수로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _CHAR_UNSIGNED 기본 char 형식이 부호 없는 형식인 경우 1로 정의됩니다. 이 값은 /J(부호 없는 기본 문자 형식) 컴파일러 옵션이 설정된 경우 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • __CLR_VER 앱을 컴파일하는 데 사용되는 CLR(공용 언어 런타임)의 버전을 나타내는 정수 리터럴로 정의됩니다. 값은 Mmmbbbbb 형식으로 인코딩됩니다. 여기서 M은 런타임의 주 버전이고, mm은 런타임의 부 버전이며, bbbbb는 빌드 번호입니다. __CLR_VER/clr 컴파일러 옵션이 설정된 경우 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

    // clr_ver.cpp
    // compile with: /clr
    using namespace System;
    int main() {
       Console::WriteLine(__CLR_VER);
    }
    
  • _CONTROL_FLOW_GUARD /guard:cf(제어 흐름 보호 사용) 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • __COUNTER__ 0에서 시작하는 정수 리터럴로 확장됩니다. 이 값은 원본 파일 또는 원본 파일의 포함된 헤더에서 사용될 때마다 1씩 증가합니다. __COUNTER__는 미리 컴파일된 헤더를 사용하는 경우 해당 상태를 기억합니다. 이 매크로는 항상 정의됩니다.

    다음 예제에서는 __COUNTER__를 사용하여 형식이 동일한 세 가지 개체에 고유 식별자를 할당합니다. exampleClass 생성자는 매개 변수로 정수를 사용합니다. 애플리케이션은 main에서 __COUNTER__를 고유 식별자 매개 변수로 사용하여 exampleClass 형식의 세 개체를 선언합니다.

    // macro__COUNTER__.cpp
    // Demonstration of __COUNTER__, assigns unique identifiers to
    // different objects of the same type.
    // Compile by using: cl /EHsc /W4 macro__COUNTER__.cpp
    #include <stdio.h>
    
    class exampleClass {
        int m_nID;
    public:
        // initialize object with a read-only unique ID
        exampleClass(int nID) : m_nID(nID) {}
        int GetID(void) { return m_nID; }
    };
    
    int main()
    {
        // __COUNTER__ is initially defined as 0
        exampleClass e1(__COUNTER__);
    
        // On the second reference, __COUNTER__ is now defined as 1
        exampleClass e2(__COUNTER__);
    
        // __COUNTER__ is now defined as 2
        exampleClass e3(__COUNTER__);
    
        printf("e1 ID: %i\n", e1.GetID());
        printf("e2 ID: %i\n", e2.GetID());
        printf("e3 ID: %i\n", e3.GetID());
    
        // Output
        // ------------------------------
        // e1 ID: 0
        // e2 ID: 1
        // e3 ID: 2
    
        return 0;
    }
    
  • __cplusplus_cli C++로 컴파일되고 /clr 컴파일러 옵션이 설정된 경우 정수 리터럴 값 200406으로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다. 정의되는 경우 __cplusplus_cli는 변환 단위 전체에 적용됩니다.

    // cplusplus_cli.cpp
    // compile by using /clr
    #include "stdio.h"
    int main() {
       #ifdef __cplusplus_cli
          printf("%d\n", __cplusplus_cli);
       #else
          printf("not defined\n");
       #endif
    }
    
  • __cplusplus_winrt C++로 컴파일되고 /ZW(Windows 런타임 컴파일) 컴파일러 옵션이 설정된 경우 정수 리터럴 값 201009로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _CPPRTTI /GR(런타임 형식 정보 사용) 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _CPPUNWIND /GX(예외 처리 사용), /clr(공용 언어 런타임 컴파일) 또는 /EH(예외 처리 모델) 컴파일러 옵션 중 하나 이상이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _DEBUG /LDd, /MDd 또는 /MTd 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _DLL /MD 또는 /MDd(다중 스레드 DLL) 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • __FUNCDNAME__ 바깥쪽 함수의 데코레이팅된 이름이 포함된 문자열 리터럴로 정의됩니다. 이 매크로는 함수 내에서만 정의됩니다. /EP 또는 /P 컴파일러 옵션을 사용하는 경우 __FUNCDNAME__ 매크로가 확장되지 않습니다.

    다음 예제에서는 __FUNCDNAME__, __FUNCSIG____FUNCTION__ 매크로를 사용하여 함수 정보를 표시합니다.

    // Demonstrates functionality of __FUNCTION__, __FUNCDNAME__, and __FUNCSIG__ macros
    void exampleFunction()
    {
        printf("Function name: %s\n", __FUNCTION__);
        printf("Decorated function name: %s\n", __FUNCDNAME__);
        printf("Function signature: %s\n", __FUNCSIG__);
    
        // Sample Output
        // -------------------------------------------------
        // Function name: exampleFunction
        // Decorated function name: ?exampleFunction@@YAXXZ
        // Function signature: void __cdecl exampleFunction(void)
    }
    
  • __FUNCSIG__ 바깥쪽 함수의 시그니처가 포함된 문자열 리터럴로 정의됩니다. 이 매크로는 함수 내에서만 정의됩니다. /EP 또는 /P 컴파일러 옵션을 사용하는 경우 __FUNCSIG__ 매크로가 확장되지 않습니다. 64비트 대상에 대해 컴파일되는 경우 호출 규칙은 기본적으로 __cdecl입니다. 사용 예제는 __FUNCDNAME__ 매크로를 참조하세요.

  • __FUNCTION__ 바깥쪽 함수의 데코레이트되지 않은 이름이 포함된 문자열 리터럴로 정의됩니다. 이 매크로는 함수 내에서만 정의됩니다. /EP 또는 /P 컴파일러 옵션을 사용하는 경우 __FUNCTION__ 매크로가 확장되지 않습니다. 사용 예제는 __FUNCDNAME__ 매크로를 참조하세요.

  • _INTEGRAL_MAX_BITS 벡터가 아닌 정수 형식의 최대 크기(비트 단위)인 정수 리터럴 값 64로 정의됩니다. 이 매크로는 항상 정의됩니다.

    // integral_max_bits.cpp
    #include <stdio.h>
    int main() {
        printf("%d\n", _INTEGRAL_MAX_BITS);
    }
    
  • __INTELLISENSE__ Visual Studio IDE에서 IntelliSense 컴파일러가 전달하는 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다. 이 매크로는 IntelliSense 컴파일러가 이해하지 못하는 코드를 보호하는 데 사용하거나 해당 빌드와 IntelliSense 컴파일러 간에 전환하는 데 사용할 수 있습니다. 자세한 내용은 Troubleshooting Tips for IntelliSense Slowness(IntelliSense 속도 저하 문제 해결 팁)를 참조하세요.

  • _ISO_VOLATILE /volatile:iso 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _KERNEL_MODE /kernel(커널 모드 이진 만들기) 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _M_AMD64 x64 프로세서 또는 ARM64EC 대상으로 하는 컴파일의 정수 리터럴 값 100으로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _M_ARM ARM 프로세서를 대상으로 하는 컴파일의 경우 정수 리터럴 값 7로 정의됩니다. ARM64, ARM64EC 및 기타 대상에 대해 정의되지 않았습니다.

  • _M_ARM_ARMV7VE ARM 프로세서를 대상으로 하는 컴파일에 대해 /arch:ARMv7VE 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _M_ARM_FP ARM 프로세서 대상의 경우 설정된 /arch 컴파일러 옵션을 나타내는 정수 리터럴 값으로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

    • /arch ARM 옵션이 지정되지 않아 ARM의 기본 아키텍처(VFPv3)가 설정되었음을 나타내는 경우 30~39 범위의 값입니다.

    • /arch:VFPv4가 설정된 경우 40~49 범위의 값입니다.

    • 자세한 내용은 /arch(ARM)를 참조하세요.

  • _M_ARM64 ARM64를 대상으로 하는 컴파일에 대해 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _M_ARM64EC ARM64EC 대상으로 하는 컴파일에 대해 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _M_CEE /clr(공용 언어 런타임 컴파일) 컴파일러 옵션이 설정된 경우 001로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _M_CEE_PURE Visual Studio 2015부터는 사용되지 않습니다. /clr:pure 컴파일러 옵션이 설정된 경우 001로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _M_CEE_SAFE Visual Studio 2015부터는 사용되지 않습니다. /clr:safe 컴파일러 옵션이 설정된 경우 001로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _M_FP_CONTRACT Visual Studio 2022부터 사용할 수 있습니다. 또는 /fp:fast 컴파일러 옵션이 설정된 경우 /fp:contract 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _M_FP_EXCEPT /fp:except 또는 /fp:strict 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _M_FP_FAST /fp:fast 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _M_FP_PRECISE /fp:precise 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _M_FP_STRICT /fp:strict 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _M_IX86 x86 프로세서를 대상으로 하는 컴파일의 경우 정수 리터럴 값 600으로 정의됩니다. x64 또는 ARM 컴파일 대상의 경우 이 매크로가 정의되지 않습니다.

  • _M_IX86_FP 설정된 /arch 컴파일러 옵션 또는 기본값을 나타내는 정수 리터럴 값으로 정의됩니다. 컴파일 대상이 x86 프로세서인 경우 이 매크로는 항상 정의됩니다. 그 이외의 경우에는 정의되지 않습니다. 정의되는 경우 값은 다음과 같습니다.

    • /arch:IA32 컴파일러 옵션이 설정된 경우 0입니다.

    • /arch:SSE 컴파일러 옵션이 설정된 경우 1입니다.

    • , /arch:AVX또는 /arch:AVX2/arch:AVX512 /arch:AVX10.1 컴파일러 옵션이 설정된 경우 /arch:SSE22입니다. /arch 컴파일러 옵션이 지정되지 않은 경우 이 값이 기본값입니다. /arch:AVX가 지정된 경우 __AVX__ 매크로도 정의됩니다. /arch:AVX2가 지정된 경우 __AVX____AVX2__도 정의됩니다. /arch:AVX512가 지정된 경우 __AVX__, __AVX2__, __AVX512BW__, __AVX512CD__, __AVX512DQ__, __AVX512F____AVX512VL__도 정의됩니다. 지정된 경우/arch:AVX10.1, __AVX__, , __AVX2____AVX512BW__, __AVX512CD__, __AVX512DQ__, __AVX512F____AVX512VL____AVX10_VER__ 정의됩니다.

    • 자세한 내용은 /arch(x86)를 참조하세요.

  • _M_X64 x64 프로세서 또는 ARM64EC 대상으로 하는 컴파일의 정수 리터럴 값 100으로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _MANAGED /clr 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _MSC_BUILD 컴파일러 버전 번호의 수정 번호 요소가 포함된 정수 리터럴로 정의됩니다. 수정 번호는 마침표로 구분된 버전 번호의 마지막 요소입니다. 예를 들어 Microsoft C/C++ 컴파일러의 버전 번호가 15.00.20706.01이 _MSC_BUILD 면 매크로는 1입니다. 이 매크로는 항상 정의됩니다.

  • _MSC_EXTENSIONS 기본적으로 사용되는 /Ze(언어 확장 사용) 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _MSC_FULL_VER 컴파일러 버전 번호의 주 번호, 부 번호 및 빌드 번호 요소를 인코딩하는 정수 리터럴로 정의됩니다. 주 번호는 마침표로 구분된 버전 번호의 첫 번째 요소이며, 부 번호는 두 번째 요소이고, 빌드 번호는 세 번째 요소입니다.

    예를 들어 Microsoft C/C++ 컴파일러 버전이 19.39.33519인 _MSC_FULL_VER 경우 193933519. 컴파일러의 버전 번호를 보려면 명령줄에 cl /?를 입력합니다. 이 매크로는 항상 정의됩니다. 컴파일러 버전 관리에 대한 자세한 내용은 Visual Studio 2019 16.8, 16.9, 16.10 및 16.11에 대한 자세한 내용은 Visual Studio 2017부터 C++ 컴파일러 버전 관리_MSC_FULL_VER 특히 서비스 릴리스를 참조하세요.

  • _MSC_VER 컴파일러 버전 번호의 주 번호 및 부 번호 요소를 인코딩하는 정수 리터럴로 정의됩니다. 주 번호는 마침표로 구분된 버전 번호의 첫 번째 요소이며, 부 번호는 두 번째 요소입니다. 예를 들어 Microsoft C/C++ 컴파일러의 버전 번호가 17.00.51106.1이면 값 _MSC_VER 은 1700입니다. 컴파일러의 버전 번호를 보려면 명령줄에 cl /?를 입력합니다. 이 매크로는 항상 정의됩니다.

    지정된 버전의 Visual Studio 이상에서 컴파일러 릴리스 또는 업데이트를 테스트하려면 연산자를 >= 사용합니다. 조건부 지시문에서 이 연산자를 사용하여 알려진 버전과 _MSC_VER을 비교할 수 있습니다. 비교할 상호 배타적인 버전이 여러 개 있는 경우 버전 번호의 내림차순으로 비교 순서를 지정합니다. 예를 들어 아래 코드는 Visual Studio 2017 이상에서 릴리스된 컴파일러를 확인합니다. 다음으로 Visual Studio 2015 이상에서 릴리스된 컴파일러를 확인합니다. 그런 다음 Visual Studio 2015 이전에 릴리스된 모든 컴파일러를 확인합니다.

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

    동일한 주 버전과 부 버전을 공유하는 Visual Studio 2019 16.8 및 16.9 및 16.10 및 16.11에 대한 _MSC_VER자세한 내용은 Visual Studio 2017부터 서비스 릴리스를 참조하세요.

    컴파일러 버전 관리 기록 및 컴파일러 버전 번호 및 해당하는 Visual Studio 버전에 대한 자세한 내용은 C++ 컴파일러 버전 관리를 참조 하세요. 또한 Microsoft C++ 팀 블로그의 Visual C++ 컴파일러 버전입니다.

  • _MSVC_LANG 컴파일러가 대상으로 하는 C++ 언어 표준을 지정하는 정수 리터럴로 정의됩니다. C++로 컴파일된 코드만 설정합니다. 기본적으로 또는 /std:c++14 컴파일러 옵션이 지정된 경우 이 매크로는 정수 리터럴 값 201402L입니다. /std:c++17 컴파일러 옵션이 지정된 경우 매크로가 201703L로 설정됩니다. /std:c++20 컴파일러 옵션이 지정된 경우 매크로가 202002L로 설정됩니다. /std:c++latest 옵션이 지정된 경우 지정되지 않은 더 높은 값으로 설정됩니다. 그 이외의 경우에는 매크로가 정의되지 않습니다. Visual Studio 2015 업데이트 3부터 _MSVC_LANG 매크로 및 /std(언어 표준 버전 지정) 컴파일러 옵션을 사용할 수 있습니다.

  • __MSVC_RUNTIME_CHECKS /RTC 컴파일러 옵션 중 하나가 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _MSVC_TRADITIONAL:

    • Visual Studio 2017 버전 15.8부터 사용 가능: 전처리기 규칙 모드 /experimental:preprocessor 컴파일러 옵션이 설정된 경우 0으로 정의됩니다. 기본적으로 또는 /experimental:preprocessor- 컴파일러 옵션이 설정된 경우 기존 전처리기가 사용 중임을 나타내도록 1로 정의됩니다.
    • Visual Studio 2019 버전 16.5부터 사용 가능: 전처리기 규칙 모드 /Zc:preprocessor 컴파일러 옵션이 설정된 경우 0으로 정의됩니다. 기본적으로 또는 /Zc:preprocessor- 컴파일러 옵션이 설정된 경우 기존 전처리기가 사용 중임을 나타내도록(기본적으로 /Zc:preprocessor가 사용되지 않는 /experimental:preprocessor를 대체함) 1로 정의됩니다.
    #if !defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL
    // Logic using the traditional preprocessor
    #else
    // Logic using cross-platform compatible preprocessor
    #endif
    
  • _MT /MD 또는 /MDd(다중 스레드 DLL) 또는 /MT 또는 /MTd(다중 스레드)가 지정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _NATIVE_WCHAR_T_DEFINED /Zc:wchar_t 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _OPENMP /openmp(OpenMP 2.0 지원 활성화) 컴파일러 옵션이 설정된 경우 정수 리터럴 200203으로 정의됩니다. 이 값은 MSVC에 의해 구현된 OpenMP 사양의 날짜를 나타냅니다. 그 이외의 경우에는 정의되지 않습니다.

    // _OPENMP_dir.cpp
    // compile with: /openmp
    #include <stdio.h>
    int main() {
        printf("%d\n", _OPENMP);
    }
    
  • _PREFAST_ /analyze 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • __SANITIZE_ADDRESS__ Visual Studio 2019 버전 16.9부터 사용 가능. 컴파일러 옵션이 설정된 경우 /fsanitize=address 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • __TIMESTAMP__ 현재 소스 파일의 마지막 수정 날짜 및 시간이 포함되어 있으며 CRT asctime 함수에서 반환하는 약식 상수 길이 형식의 문자열 리터럴(예: Fri 19 Aug 13:32:58 2016)로 정의됩니다. 이 매크로는 항상 정의됩니다.

  • _VC_NODEFAULTLIB /Zl(기본 라이브러리 이름 생략) 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _WCHAR_T_DEFINED 기본 /Zc:wchar_t 컴파일러 옵션이 설정된 경우 1로 정의됩니다. _WCHAR_T_DEFINED 매크로가 정의되어 있어도 /Zc:wchar_t- 컴파일러 옵션이 설정된 경우 값을 포함하지 않으므로 wchar_t는 프로젝트에 포함된 시스템 헤더 파일에 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _WIN32 컴파일 대상이 32비트 ARM, 64비트 ARM, x86 또는 x64인 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _WIN64 컴파일 대상이 64비트 ARM 또는 x64인 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

  • _WINRT_DLL C++로 컴파일되고 /ZW(Windows 런타임 컴파일) 컴파일러 옵션과 /LD 또는 /LDd 컴파일러 옵션이 둘 다 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.

ATL 또는 MFC 라이브러리 버전을 식별하는 전처리기 매크로는 컴파일러에 미리 정의되어 있지 않습니다. ATL 및 MFC 라이브러리 헤더는 내부적으로 이러한 버전 매크로를 정의합니다. 필요한 헤더가 포함되기 전에 만들어진 전처리기 지시문에서는 해당 매크로가 정의되지 않습니다.

  • _ATL_VER <atldef.h>에 ATL 버전 번호를 인코딩하는 정수 리터럴로 정의됩니다.

  • _MFC_VER <afxver_.h>에 MFC 버전 번호를 인코딩하는 정수 리터럴로 정의됩니다.

참고 항목

매크로(C/C++)
전처리기 연산자
전처리기 지시문