宏定义的妙用

使用宏定义转字符串字符以及连接

编译过程:
1,扫描解析文件
2,预处理(宏在此时处理,该替换的文字会被替换)
3,对处理过的源代码进行汇编,输出汇编语言的代码(C语言的控制流程被处理)
4,编译为二进制目标文件
5,与程序库进行链接,输出最终的程序文件
(宏 和 C语言在不同的阶段处理执行)

宏替换是在语法分析前进行的,对于变量是不能做到的。这点要注意。

#define ToChar(x) #@x   //x加上''
#define Conn(x, y) x##y //连接x,y 对比strcat()函数
#define ToString(x) #x  //x加上"" 对比itoa()函数

#include <iostream>
#include <stdlib.h>

using namespace std;

int main(){

    /*Conn(x, y)*/
    int iNum1 = Conn(12, 34);         //数字
    char *str1 = Conn("12", "23");    //字符串

    /*ToChar(x)*/
    char chNum = ToChar(2);           //数字转字符
    //char chCharacter = ToChar('q');   //这样不对 , 字符外面不能加‘’

    /*ToString(x)*/
    char *strNum = ToString(1234);    //数字转字符串

    cout << strlen (strNum) << endl;
    cout << iNum1 << endl;           //输出连接后的数字
    cout << str1 << endl;            //输出连接后的字符串
    cout << chNum << endl;           //输出数字转字符 
    //cout << chCharacter << endl;     //输出字符转字符 
    cout << strNum << endl;          //输出数字转字符串
    system ("pause");
    return 0;
}


编译器支持 ISO C99 和 ISO C + + 11 中指定此预定义的标识符。

  • __func__ 为函数本地将封闭函数的未限定和未修饰名称 static``const 数组 char

编译器支持 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 函数。 始终定义此宏。

  • __VA_ARGS__将左边宏中 ... 的内容原样抄写在右边 __VA_ARGS__ 所在的位置。它是一个可变参数的宏,是新的C99规范中新增的,目前似乎只有gcc支持(VC从VC2005开始支持)。

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 设置编译器选项。 否则,未定义。

  • _CONTROL_FLOW_GUARD 定义为 1 时 /guard:cf (启用控制流防护) 设置编译器选项。 否则,未定义。

  • __COUNTER__ Expands 为整数文字,从 0 开始的和每次在源文件中使用,就会递增 1,或者包含的源文件标头。 __COUNTER__ 会记住其状态时使用预编译的头。 始终定义此宏。

    此示例使用 __COUNTER__ 要分配给同一类型的三个不同的对象的唯一标识符。 exampleClass 构造函数采用一个整数作为参数。 

  • __cplusplus_cli 定义为整数文字值 200406 在作为 c + + 编译时和 /clr, ,/clr: pure, ,或 /clr: safe 设置编译器选项。 否则,未定义。 在定义时, __cplusplus_cli 有效范围是整个翻译单元。

  • __cplusplus_winrt 定义为整数文字值 201009 在作为 c + + 编译时和 /ZW (Windows 运行时编译) 设置编译器选项。 否则,未定义。

  • _CPPRTTI 定义为 1 如果 /GR (启用运行时类型信息) 设置编译器选项。 否则,未定义。

  • _CPPUNWIND 定义为 1,如果一个或多个 /GX (启用异常处理), ,/clr (公共语言运行时编译), ,或 /EH (异常处理模型) 设置编译器选项。 否则,未定义。

  • _DEBUG 定义为 1 时 /LDd, ,/MDd, ,或 /MTd 设置编译器选项。 否则,未定义。

  • _DLL 定义为 1 时 /MD 或 /MDd 设置 (多线程 DLL) 编译器选项。 否则,未定义。

  • __FUNCDNAME__ 定义为一个字符串,它包含 修饰名 将封闭函数。 仅在函数内定义宏。 __FUNCDNAME__ 如果您使用不扩展宏 /EP 或 /P 编译器选项。

    此示例使用 __FUNCDNAME__, ,__FUNCSIG__, ,和 __FUNCTION__ 宏来显示函数信息。

  • __FUNCSIG__ 定义为一个字符串,它包含封闭函数的签名。 仅在函数内定义宏。 __FUNCSIG__ 如果您使用不扩展宏 /EP 或 /P 编译器选项。 当针对 64 位目标编译,调用约定是 __cdecl 默认情况下。 有关用法的示例,请参阅 __FUNCDNAME__ 宏。

  • __FUNCTION__ 定义为包含封闭函数的未修饰的名称的字符串文字。 仅在函数内定义宏。 __FUNCTION__ 如果您使用不扩展宏 /EP 或 /P 编译器选项。 有关用法的示例,请参阅 __FUNCDNAME__ 宏。

  • _INTEGRAL_MAX_BITS 为整数文字值 64 的定义、 非向量整型的最大大小 (以位为单位)。 始终定义此宏。

  • __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 处理器。 否则,未定义。 在定义时,其值为︰

    • /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 支持) 设置编译器选项。 否则,未定义。

  • _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 版本编号。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值