// integral_max_bits.cpp
#include <stdio.h>
int main() {
printf("%d\n", _INTEGRAL_MAX_BITS);
__INTELLISENSE__
:当在 Visual Studio IDE 中传递 IntelliSense 编译器时,定义为 1。 其他情况下则不定义。 可使用此宏来保护 IntelliSense 编译器不理解的代码,也可使用它在生成和 IntelliSense 编译器之间进行切换。 有关详细信息,请参阅 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 处理器的编译设置了 编译器选项,则定义为 1/arch:ARMv7VE
。 其他情况下则不定义。
_M_ARM_FP
:定义为整数文本值,表示为面向 ARM 处理器的编译设置的 编译器选项/arch
。 其他情况下则不定义。
如果未指定 /arch
ARM 选项,则该值在 30-39 范围内,表示为 ARM 设置了默认体系结构 (VFPv3
)。
如果设置了 /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:contract
或 /fp:fast
编译器选项,则定义为 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:SSE2
、/arch:AVX
、/arch:AVX2
或 /arch:AVX512
编译器选项,则值为 2。 如果未指定 /arch
编译器选项,则为默认值。 当指定了 /arch:AVX
时,还会定义宏 __AVX__
。 当指定了 /arch:AVX2
时,还会定义 __AVX__
和 __AVX2__
。 当指定了 /arch:AVX512
时,还会定义 __AVX__
、__AVX2__
、__AVX512BW__
、__AVX512CD__
、__AVX512DQ__
、__AVX512F__
和 __AVX512VL__
。
有关详细信息,请参阅 /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++ 编译器的版本号为 15.00.20706.01,则 _MSC_FULL_VER
宏计算结果为 150020706。 在命令行中键入 cl /?
,查看编译器的版本号。 任何情况下都会定义此宏。
_MSC_VER
:定义为编码编译器版本号的主版本号和次版本号元素的整数文本。 主版本号是用句点分隔的版本号的第一个元素,而次版本号是第二个元素。 例如,如果 Microsoft C/C++ 编译器的版本号为 17.00.51106.1,则 _MSC_VER
宏计算结果为 1700。 在命令行中键入 cl /?
,查看编译器的版本号。 任何情况下都会定义此宏。
Visual Studio 版本
_MSC_VER
要在指定的 Visual Studio 版本或更高版本中测试编译器版本或更新,请使用 >=
运算符。 可在条件指令中使用它来比较 _MSC_VER
与已知版本。 如果要比较多个互相排斥的版本,请按版本号的降序顺序进行比较。 例如,此代码将检查 Visual Studio 2017 和更高版本中发布的编译器。 接下来,它会检查 Visual Studio 2015 以及之后发布的编译器。 然后,它会检查 Visual Studio 2015 之前发布的所有编译器:
#if _MSC_VER >= 1910
// . . .
#elif _MSC_VER >= 1900
// . . .
#else
// . . .
#endif
要测试共享主要和次要版本号的编译器版本,请使用 _MSC_FULL_VER
中的主要、次要和内部版本号进行比较。 Visual Studio 2019 v16.9 中的编译器的 _MSC_FULL_VER
值为 192829500 或更大。 Visual Studio 2019 16.11 版本中的编译器的 _MSC_FULL_VER
值为 192930100 或更大。
有关详细信息,请参阅 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 Update 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-
编译器选项时,定义为 1,指示正在使用传统预处理器(实质上,即 /Zc:preprocessor
取代了已弃用的 /experimental:preprocessor
)。
#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。 但如果设置了 /Zc:wchar_t-
编译器选项并且在项目中包含的系统头文件中定义了 wchar_t
,则会定义 _WCHAR_T_DEFINED
宏,但不会定义其值。 其他情况下则不定义。
_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++)
预处理器运算符
预处理器指令