宏定义中#和##符号的使用和宏定义展开问题
2017-03-23 08:55
309 查看
程序如下:
答案:第一行:12 第二行:f(1,2)
说明:
1、关于符号#和##
两个符号都只能用于预处理宏扩展。不能在普通的源码中使用它们,只能在宏定义中使用。
简单的说,#是把宏参数变为一个字符串,##是把两个宏参数连接在一起。
2、关于宏展开
预处理过程的几个步骤:
1)字符集转换(如三联字符)
2)断行链接/
3)注释处理,/* comment */,被替换成空格
4)执行预处理命令,如#inlcude、#define、#pragma、#error等
5)转义字符替换
6)相邻字符串拼接
7)将预处理记号替换为词法记号
第4)步即如何展开宏函数的规则:在展开当前宏函数时,如果形参有#或##则不进行宏参数的展开,否则先展开宏参数,再展开当前宏。
#include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf("%s\n", h(f(1,2))); printf("%s\n", g(f(1,2))); return 0; }
答案:第一行:12 第二行:f(1,2)
说明:
1、关于符号#和##
两个符号都只能用于预处理宏扩展。不能在普通的源码中使用它们,只能在宏定义中使用。
简单的说,#是把宏参数变为一个字符串,##是把两个宏参数连接在一起。
2、关于宏展开
预处理过程的几个步骤:
1)字符集转换(如三联字符)
2)断行链接/
3)注释处理,/* comment */,被替换成空格
4)执行预处理命令,如#inlcude、#define、#pragma、#error等
5)转义字符替换
6)相邻字符串拼接
7)将预处理记号替换为词法记号
第4)步即如何展开宏函数的规则:在展开当前宏函数时,如果形参有#或##则不进行宏参数的展开,否则先展开宏参数,再展开当前宏。
相关文章推荐
- 关于宏定义中#和##符号的使用和宏定义展开问题
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- 宏定义中#和##符号的使用和宏定义展开问题
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- 宏定义中#和##符号的使用和宏定义展开
- #和##在宏定义中使用问题
- C 语言宏定义时紧跟#和##后面的宏不能展开的问题
- 使用juery treeview 出现的点击文本不进行展开的问题
- Regex.Split 在分割 "|" 符号时出现问题,应该使用 "[|]" 才可以分组
- 解决使用JavaScriptConvert转换对象为Json时,中文和&符号被转码的问题
- C语言学习11:typedef和define区别,头文件的使用以及 <>和“”区别,宏定义中#和##的用法,条件编译,gcc和c99中宏定义使用printf和sprintf,条件编译避免头文件包含
- 64位无符号溢出后差1的问题: UINT(-3) + UINT64(5) ) % UINT64(5) 竟然等于了3 (后续避免使用UINT 溢出效果)
- 宏定义中#和##的使用
- C/C++中##符号的使用
- 编程中使用无符号类型潜在的问题
- 生成VC宏展开以及#和##使用
- 使用jxl.jar解析excel特殊符号乱码问题解决.