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로 컴파일되고 컴파일러 옵션이 지정된 경우/Za1로 정의됩니다. Visual Studio 2022 버전 17.2부터는 C로 컴파일되고 컴파일러 옵션이 지정된 경우/Zc:__STDC__1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.__STDC_HOSTED__구현이 전체 필수 표준 라이브러리를 지원하는 ‘호스트된 구현’인 경우 1로 정의됩니다. 그 이외의 경우에는 0으로 정의됩니다.__STDC_NO_ATOMICS__구현이 선택적 표준 원자성을 지원하지 않는 경우 1로 정의됩니다. MSVC 구현은 C로 컴파일되고/stdC11 또는 C17 옵션 중 하나가 지정되는 경우 1로 정의됩니다.__STDC_NO_COMPLEX__구현이 선택적 표준 복소수를 지원하지 않는 경우 1로 정의됩니다. MSVC 구현은 C로 컴파일되고/stdC11 또는 C17 옵션 중 하나가 지정되는 경우 1로 정의됩니다.__STDC_NO_THREADS__구현이 선택적 표준 스레드를 지원하지 않는 경우 1로 정의됩니다. MSVC 구현은 C로 컴파일되고/stdC11 또는 C17 옵션 중 하나가 지정되는 경우 1로 정의됩니다.__STDC_NO_VLA__구현이 표준 가변 길이 배열을 지원하지 않는 경우 1로 정의됩니다. MSVC 구현은 C로 컴파일되고/stdC11 또는 C17 옵션 중 하나가 지정되는 경우 1로 정의됩니다.__STDC_VERSION__C로 컴파일되고/stdC11 또는 C17 옵션 중 하나가 지정되는 경우 정의됩니다.201112L로 확장(/std:c11의 경우)되거나201710L로 확장(/std:c17의 경우)됩니다.__STDCPP_DEFAULT_NEW_ALIGNMENT__/std:c17지정하거나 나중에 지정하면 이 매크로는 맞춤을 인식하지 않는size_t호출에 의해 보장되는 맞춤 값이 있는 리터럴로 확장operator new됩니다. 더 큰 맞춤은 맞춤 인식 오버로드(예: .)에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_ARCHARM 아키텍처 버전을 나타내는 정수 리터럴로 정의됩니다. 값은 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:AVX10.1/arch:AVX512또는 컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는/arch:AVX10.2x64일 때/arch:AVX1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.__AVX2__,/arch:AVX512,/arch:AVX10.1또는 컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는/arch:AVX10.2x64일 때/arch:AVX21로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.__AVX512BW__또는/arch:AVX10.1컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는/arch:AVX10.2x64일 때/arch:AVX5121로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.__AVX512CD__또는/arch:AVX10.1컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는/arch:AVX10.2x64일 때/arch:AVX5121로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.__AVX512DQ__또는/arch:AVX10.1컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는/arch:AVX10.2x64일 때/arch:AVX5121로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.__AVX512F__또는/arch:AVX10.1컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는/arch:AVX10.2x64일 때/arch:AVX5121로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.__AVX512VL__또는/arch:AVX10.1컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는/arch:AVX10.2x64일 때/arch:AVX5121로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.__AVX10_VER__또는 컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는/arch:AVX10.2x64일 때/arch:AVX10.1AVX10 버전을 나타내는 정수로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다._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에서exampleClass를 고유 식별자 매개 변수로 사용하여__COUNTER__형식의 세 개체를 선언합니다.// 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_cliC++로 컴파일되고/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_winrtC++로 컴파일되고/ZW(Windows 런타임 컴파일) 컴파일러 옵션이 설정된 경우 정수 리터럴 값 201009로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다._CPPRTTI/GR(런타임 형식 정보 사용) 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다._CPPUNWIND/GX(예외 처리 사용),/clr(공용 언어 런타임 컴파일) 또는/EH(예외 처리 모델) 컴파일러 옵션 중 하나 이상이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다._DEBUG/LDd,/MDd또는/MTd컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다._DLL/MD또는/MDd(다중 스레드 DLL) 컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.__FUNCDNAME__바깥쪽 함수의 데코레이팅된 이름이 포함된 문자열 리터럴로 정의됩니다. 이 매크로는 함수 내에서만 정의됩니다.__FUNCDNAME__또는/EP컴파일러 옵션을 사용하는 경우/P매크로가 확장되지 않습니다.다음 예제에서는
__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__바깥쪽 함수의 시그니처가 포함된 문자열 리터럴로 정의됩니다. 이 매크로는 함수 내에서만 정의됩니다.__FUNCSIG__또는/EP컴파일러 옵션을 사용하는 경우/P매크로가 확장되지 않습니다. 64비트 대상에 대해 컴파일되는 경우 호출 규칙은 기본적으로__cdecl입니다. 사용 예제는__FUNCDNAME__매크로를 참조하세요.__FUNCTION__바깥쪽 함수의 데코레이트되지 않은 이름이 포함된 문자열 리터럴로 정의됩니다. 이 매크로는 함수 내에서만 정의됩니다.__FUNCTION__또는/EP컴파일러 옵션을 사용하는 경우/P매크로가 확장되지 않습니다. 사용 예제는__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_AMD64x64 프로세서 또는 ARM64EC 대상으로 하는 컴파일의 정수 리터럴 값 100으로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다._M_ARMARM 프로세서를 대상으로 하는 컴파일의 경우 정수 리터럴 값 7로 정의됩니다. ARM64, ARM64EC 및 기타 대상에 대해 정의되지 않았습니다._M_ARM_ARMV7VEARM 프로세서를 대상으로 하는 컴파일에 대해/arch:ARMv7VE컴파일러 옵션이 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다._M_ARM_FPARM 프로세서 대상의 경우 설정된/arch컴파일러 옵션을 나타내는 정수 리터럴 값으로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다./archARM 옵션이 지정되지 않아 ARM의 기본 아키텍처(VFPv3)가 설정되었음을 나타내는 경우 30~39 범위의 값입니다./arch:VFPv4가 설정된 경우 40~49 범위의 값입니다.자세한 내용은
/arch(ARM)를 참조하세요.
_M_ARM64ARM64를 대상으로 하는 컴파일에 대해 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다._M_ARM64ECARM64EC 대상으로 하는 컴파일에 대해 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다._M_CEE/clr(공용 언어 런타임 컴파일) 컴파일러 옵션이 설정된 경우 001로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다._M_CEE_PUREVisual Studio 2015부터는 사용되지 않습니다./clr:pure컴파일러 옵션이 설정된 경우 001로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다._M_CEE_SAFEVisual Studio 2015부터는 사용되지 않습니다./clr:safe컴파일러 옵션이 설정된 경우 001로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다._M_FP_CONTRACTVisual Studio 2022부터 사용할 수 있습니다. 또는/fp:contract컴파일러 옵션이 설정된 경우/fp:fast1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다._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_IX86x86 프로세서를 대상으로 하는 컴파일의 경우 정수 리터럴 값 600으로 정의됩니다. x64 또는 ARM 컴파일 대상의 경우 이 매크로가 정의되지 않습니다._M_IX86_FP설정된/arch컴파일러 옵션 또는 기본값을 나타내는 정수 리터럴 값으로 정의됩니다. 컴파일 대상이 x86 프로세서인 경우 이 매크로는 항상 정의됩니다. 그 이외의 경우에는 정의되지 않습니다. 정의되는 경우 값은 다음과 같습니다./arch:IA32컴파일러 옵션이 설정된 경우 0입니다./arch:SSE컴파일러 옵션이 설정된 경우 1입니다., ,
/arch:AVX,/arch:AVX10.1/arch:AVX2/arch:AVX512또는/arch:AVX10.2컴파일러 옵션이 설정된 경우/arch:SSE22입니다./arch컴파일러 옵션이 지정되지 않은 경우 이 값이 기본값입니다./arch:AVX가 지정된 경우__AVX__매크로도 정의됩니다./arch:AVX2가 지정된 경우__AVX__및__AVX2__도 정의됩니다./arch:AVX512가 지정된 경우__AVX__,__AVX2__,__AVX512BW__,__AVX512CD__,__AVX512DQ__,__AVX512F__및__AVX512VL__도 정의됩니다. 지정/arch:AVX10.1되거나/arch:AVX10.2지정된 경우,__AVX__,__AVX2__,__AVX512BW__,__AVX512CD__,__AVX512DQ__및__AVX512F____AVX512VL____AVX10_VER__정의됩니다.자세한 내용은
/arch(x86)를 참조하세요.
_M_X64x64 프로세서 또는 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, 서비스 릴리스를 참조하세요._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++로 컴파일된 코드만 설정합니다. 기본적으로 또는201402L컴파일러 옵션이 지정된 경우 이 매크로는 정수 리터럴 값/std:c++14입니다.201703L컴파일러 옵션이 지정된 경우 매크로가/std:c++17로 설정됩니다.202002L컴파일러 옵션이 지정된 경우 매크로가/std:c++20로 설정됩니다./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- Visual Studio 2017 버전 15.8부터 사용 가능: 전처리기 규칙 모드
_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=address1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.__TIMESTAMP__현재 소스 파일의 마지막 수정 날짜 및 시간이 포함되어 있으며 CRTasctime함수에서 반환하는 약식 상수 길이 형식의 문자열 리터럴(예: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 또는 ARM64EC 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다._WIN64컴파일 대상이 64비트 ARM, x64 또는 ARM64EC 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다._WINRT_DLLC++로 컴파일되고/ZW(Windows 런타임 컴파일) 컴파일러 옵션과/LD또는/LDd컴파일러 옵션이 둘 다 설정된 경우 1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.
ATL 또는 MFC 라이브러리 버전을 식별하는 전처리기 매크로는 컴파일러에 미리 정의되어 있지 않습니다. ATL 및 MFC 라이브러리 헤더는 내부적으로 이러한 버전 매크로를 정의합니다. 필요한 헤더가 포함되기 전에 만들어진 전처리기 지시문에서는 해당 매크로가 정의되지 않습니다.
_ATL_VER<atldef.h>에 ATL 버전 번호를 인코딩하는 정수 리터럴로 정의됩니다._MFC_VER<afxver_.h>에 MFC 버전 번호를 인코딩하는 정수 리터럴로 정의됩니다.