很长一段时间在win下开发,把一些win下特有的宏和标准c++预定义宏混淆了。记录一下
参考链接:https://msdn.microsoft.com/zh-cn/library/b0084kay.aspx
https://en.cppreference.com/w/cpp/preprocessor/replace
Visual c + + 编译器预定义某些预处理器宏,具体取决于语言 (C 或 c + +)、 编译目标,以及选择的编译器选项。
Visual c + + 支持 ANSI/ISO C99 标准和 ISO C + + 14 标准所指定的所需预定义的预处理器宏。 该实现还支持几个更多特定于 Microsoft 的预处理器宏。 仅针对特定的生成环境或编译器选项定义一些宏,宏。 除非另有说明,宏的定义整个翻译单元如同它们指定为 /D 编译器选项参数。 在定义时,宏是由预处理器在编译前扩展为指定的值。 预定义的宏不采用任何参数,并且不能重新定义。
标准的预定义的标识符
编译器支持 ISO C99 和 ISO C + + 11 中指定此预定义的标识符。
-
__func__ 为函数本地将封闭函数的未限定和未修饰名称
static``const
数组char
。C++
void example(){ printf("%s\n", __func__); } // prints "example"
标准预定义的宏
编译器支持 ISO C99 和 ISO C + + 14 标准所指定的这些预定义的宏。
-
__cplusplus 翻译单元将作为 c + + 编译时定义为整数文字值。 否则,未定义。
-
__DATE__ 当前源文件的编译日期。 日期是一个固定长度的字符串文字的窗体 Mmm dd yyyy。 月份名称 Mmm 等同于中的缩写的月份名称生成的 C 运行库日期 asctime 函数。 日期的第一个字符 dd 是一个空间,如果值是小于 10。 始终定义此宏。
-
__FILE__ 当前源文件的名称。 __FILE__ 扩展到字符的字符串文字。 若要确保显示该文件的完整路径,请使用 /FC (完整路径的源代码文件中诊断程序)。 始终定义此宏。
-
__LINE__ 定义为当前源文件中的整数行号。 值 __LINE__ 宏可通过使用更改
#line
指令。 始终定义此宏。 -
__STDC__ 定义为 1,仅当作为 C 编译,如果 /Za 指定编译器选项。 否则,未定义。
-
__STDC_HOSTED__ 定义为 1,如果实现是 承载实现, ,属于支持整个所需的标准库的支持。 否则,定义为 0。
-
__STDCPP_THREADS__ 定义为 1,当且仅当一个程序可以有多个线程的执行,并且编译为 c + +。 否则,未定义。
-
__TIME__ 预处理过的翻译单元的转换的时间。 时间是字符的字符串文字的窗体 ︰ 分︰ 秒, ,由 C 运行时库返回的时间相同 asctime 函数。 始终定义此宏。
Microsoft 专用预定的义宏
Microsoft Visual c + + 支持这些其他预定义的宏。
-
__ATOM__ 定义为 1 时 /favor:ATOM 设置编译器选项和编译器目标是 x86 或 x64。 否则,未定义。
-
__AVX__ 定义为 1 时 /arch:AVX 或 /arch: avx2 可以 设置编译器选项和编译器目标是 x86 或 x64。 否则,未定义。
-
__AVX2__ 定义为 1 时 /arch: avx2 可以 设置编译器选项和编译器目标是 x86 或 x64。 否则,未定义。
-
_CHAR_UNSIGNED 默认值定义为 1 如果
char
类型是无符号。 此值设置时 /J (默认 char 类型是无符号) 设置编译器选项。 否则,未定义。 -
__CLR_VER 定义为整数文字表示在已编译的应用程序时使用的公共语言运行时版本。 在窗体中编码的值
Mmmbbbbb
, ,其中M
是运行时,主要版本mm
是运行时的次要版本和bbbbb
为内部版本号。 __CLR_VER 如果定义 /clr 设置编译器选项。 否则,未定义。C++
// clr_ver.cpp // compile with: /clr using namespace System; int main() { Console::WriteLine(__CLR_VER); }
-
_CONTROL_FLOW_GUARD 定义为 1 时 /guard:cf (启用控制流防护) 设置编译器选项。 否则,未定义。
-
__COUNTER__ Expands 为整数文字,从 0 开始的和每次在源文件中使用,就会递增 1,或者包含的源文件标头。 __COUNTER__ 会记住其状态时使用预编译的头。 始终定义此宏。
此示例使用
__COUNTER__
要分配给同一类型的三个不同的对象的唯一标识符。exampleClass
构造函数采用一个整数作为参数。 在main
, ,应用程序声明了三个对象类型的exampleClass
, ,并使用__COUNTER__
用作唯一标识符参数︰C++
// 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 定义为整数文字值 200406 在作为 c + + 编译时和 /clr, ,/clr: pure, ,或 /clr: safe 设置编译器选项。 否则,未定义。 在定义时, __cplusplus_cli 有效范围是整个翻译单元。
C++
// 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 定义为整数文字值 201009 在作为 c + + 编译时和 /ZW (Windows 运行时编译) 设置编译器选项。 否则,未定义。
-
_CPPRTTI 定义为 1 如果 /GR (启用运行时类型信息) 设置编译器选项。 否则,未定义。
-
_CPPUNWIND 定义为 1,如果一个或多个 /GX (启用异常处理), ,/clr (公共语言运行时编译), ,或 /EH (异常处理模型) 设置编译器选项。 否则,未定义。
-
__FUNCDNAME__ 定义为一个字符串,它包含 修饰名 将封闭函数。 仅在函数内定义宏。 __FUNCDNAME__ 如果您使用不扩展宏 /EP 或 /P 编译器选项。
此示例使用
__FUNCDNAME__
, ,__FUNCSIG__
, ,和__FUNCTION__
宏来显示函数信息。C++
// 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 的定义、 非向量整型的最大大小 (以位为单位)。 始终定义此宏。
C++
// integral_max_bits.cpp #include <stdio.h> int main() { printf("%d\n", _INTEGRAL_MAX_BITS); }
-
__INTELLISENSE__ 定义为 1 期间 IntelliSense 编译器将传递在 Visual Studio IDE 中。 否则,未定义。 可以使用此宏来保护的代码 IntelliSense 编译器不了解,或使用它来生成和智能感知编译器之间切换。 有关详细信息,请参阅 的智能感知缓慢疑难解答提示。
-
_ISO_VOLATILE 为 1 如果定义 /volatile: iso 设置编译器选项。 否则,未定义。
-
_KERNEL_MODE 为 1 如果定义 /kernel (创建内核模式二进制) 设置编译器选项。 否则,未定义。
-
_M_AMD64 定义为整数文字值 100 的编译该面向 x64 处理器。 否则,未定义。
-
_M_ARM 为整数文字值 7 面向 ARM 处理器的编译进行定义。 否则,未定义。
-
_M_ARM_ARMV7VE 定义为 1 时 /arch: armv7ve 面向 ARM 处理器的编译进行设置编译器选项。 否则,未定义。
-
_M_ARM_FP 定义为整数文字值,该值指示该 /arch 编译器选项已设置,如果编译目标,则 ARM 处理器。 否则,未定义。
-
如果不是 30-39 的范围中 /arch ARM 选项已指定,对于 ARM 中指示的默认体系结构已设置 (
VFPv3
)。 -
在范围内 40-49 if /arch: vfpv4 设置。
-
请参阅 /arch (ARM) 有关详细信息。
-
-
_M_ARM64 定义为 1 的面向 64 位 ARM 处理器的编译。 否则,未定义。
-
_M_CEE 定义为 001 如果任何 /clr (公共语言运行时编译) 设置编译器选项。 否则,未定义。
-
_M_CEE_PURE 定义为 001 if /clr: pure 设置编译器选项。 否则,未定义。
-
_M_CEE_SAFE 定义为 001 if /clr: safe 设置编译器选项。 否则,未定义。
-
_M_FP_EXCEPT 定义为 1 如果 /fp︰ 除 或 /fp: strict 设置编译器选项。 否则,未定义。
-
_M_FP_FAST 定义为 1 如果 /fp:fast 设置编译器选项。 否则,未定义。
-
_M_FP_PRECISE 定义为 1 如果 /fp︰ 精确 设置编译器选项。 否则,未定义。
-
_M_FP_STRICT 定义为 1 如果 /fp: strict 设置编译器选项。 否则,未定义。
-
_M_IX86 定义为整数文字值 600 的编译该面向 x86 处理器。 没有为 x64 或 ARM 编译目标定义此宏。
-
_M_IX86_FP 定义为整数文字值,该值指示 /arch 编译器选项的设置,则默认值。 此宏始终定义的编译目标时 x86 处理器。 否则,未定义。 在定义时,其值为︰
-
0 /arch:IA32 编译器选项已设置。
-
1 如果 /arch:SSE 编译器选项已设置。
-
2 如果 /arch:SSE2, ,/arch:AVX 或 /arch: avx2 可以 编译器选项已设置。 如果此值为默认值 /arch 未指定编译器选项。 当 /arch:AVX 指定,则该宏 __AVX__ 也进行了定义。 当 /arch: avx2 可以 指定,则同时 __AVX__ 和 __AVX2__ 还定义了。
-
请参阅 /arch (x86) 有关详细信息。
-
-
_M_X64 定义为整数文字值 100 的编译该面向 x64 处理器。 否则,未定义。
-
_MANAGED 指 1 /clr 设置编译器选项。 否则,未定义。
-
_MSC_BUILD 定义为整数文字,其中包含编译器的版本号的修订号元素。 修订版本号是版本号的句点分隔的第四个元素。 例如,如果 Visual c + + 编译器的版本号为 15.00.20706.01, _MSC_BUILD 宏计算结果为 1。 始终定义此宏。
-
_MSC_EXTENSIONS 定义为 1 如果 /Ze (启用语言扩展) 设置编译器选项,这是默认设置。 否则,未定义。
-
_MSC_FULL_VER 定义为整数文本进行编码主要,次版本号和内部数字元素的数目的编译器的版本号。 主版本号是句点分隔的版本号的第一个元素、 次版本号是第二个元素和内部版本号是第三个元素。 例如,如果 Visual c + + 编译器的版本号为 15.00.20706.01, _MSC_FULL_VER 宏计算结果为 150020706。 输入 cl /? 通过在命令行查看编译器的版本号。 始终定义此宏。
-
_MSC_VER 作为整形文本进行编码编译器的版本号的主要和次要数字元素定义。 主版本号是句点分隔的版本号的第一个元素和次版本号是第二个元素。 例如,如果 Visual c + + 编译器的版本号为 17.00.51106.1, _MSC_VER 宏计算结果为 1700年。 输入 cl /? 通过在命令行查看编译器的版本号。 始终定义此宏。
-
_MSVC_LANG 定义为一个整数,指定由编译器针对 c + + 语言标准。 如果宏时编译为 c + +,为整数型值 201402 /std:c + + 14 编译器选项是否设置,默认情况下,它是设置为更高时,未指定时,值 /std:c + + 中最新 设置编译器选项。 否则,该宏是不确定的。 _MSVC_LANG 宏和 /std (指定语言标准版本) 编译器选项是在 Visual Studio 2015 更新 3 开始。
-
__MSVC_RUNTIME_CHECKS 定义为 1,如果其中的 /RTC 设置编译器选项。 否则,未定义。
-
_MT 定义为 1 时 /MD 或 /MDd (多线程 DLL) 或 /MT 或 /MTd 指定 (多线程)。 否则,未定义。
-
_NATIVE_WCHAR_T_DEFINED 定义为 1 时 /zc: wchar_t 设置编译器选项。 否则,未定义。
-
_OPENMP 定义为整数文字 200203 表示由 Visual c + + 中实现的 OpenMP 规范的日期,如果 /openmp (启用 OpenMP 2.0 支持) 设置编译器选项。 否则,未定义。
C++
// _OPENMP_dir.cpp // compile with: /openmp #include <stdio.h> int main() { printf("%d\n", _OPENMP); }
-
_PREFAST_ 定义为 1 时 / 分析 设置编译器选项。 否则,未定义。
-
__TIMESTAMP__ 作为一个字符串,它包含的日期和时间的当前源文件返回的 C 运行库的缩写,常量长度窗体的上次修改定义 asctime 正常工作,例如,
Fri 19 Aug 13:32:58 2016
。 始终定义此宏。 -
_VC_NODEFAULTLIB 定义为 1 时 /Zl (省略默认库名) 设置编译器选项。 否则,未定义。
-
_WCHAR_T_DEFINED 定义为 1 时默认 /zc: wchar_t 设置编译器选项。 _WCHAR_T_DEFINED 宏定义,但如果不具有任何值 /Zc:wchar_t-设置编译器选项,并
wchar_t
项目中包含的系统标头文件中定义。 否则,未定义。 -
_WIN32 定义为 1 时编译目标是 32 位 ARM x86,在 64 位 ARM 或 x64。 否则,未定义。
-
_WIN64 编译目标为 64 位 ARM 或 x64 时定义为 1。 否则,未定义。
-
_WINRT_DLL 定义为 1 时编译为 c + + 和 /ZW (Windows 运行时编译) 和 /LD 或 /LDd 设置编译器选项。 否则,未定义。
用于确定 ATL 或 MFC 库版本的预处理器宏不是由编译器预定义的。 因此它们未定义的预处理器指令中包含必需的标头之前,这些宏的定义在库的标头。
-
_ATL_VER < atldef.h > 中定义为整数文本进行编码的 ATL 版本编号。
-
_MFC_VER < afxver_.h > 中定义为整数文本进行编码的 MFC 版本编号。
另请参阅