// 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++)
预处理器运算符
预处理器指令