미리 정의된 매크로
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:AVX
1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.__AVX2__
또는/arch:AVX512
컴파일러 옵션이 설정되고 컴파일러 대상이 x86 또는/arch:AVX10.1
x64일 때/arch:AVX2
1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.__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:SSE2
2입니다./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
- 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=address
1로 정의됩니다. 그 이외의 경우에는 정의되지 않습니다.__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인 경우 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 버전 번호를 인코딩하는 정수 리터럴로 정의됩니다.