Summary
1)'#'用于在预处理期
将宏参数转换为字符串
;只在宏定义中有效
,编译器不知道'#'
的存在
2)可以使用#+函数名
,在调用时打印函数名
3)'##'用于在预处理期 拼接两个标识符
;只在宏定义中有效
,编译器不知道'##'
的存在
4)可以使用'##'快速定义结构体
、使用结构体,快速定义类
等。
·#和##运算符分析
1、'#'
- '#'运算符用于在
预处理期
将宏参数转换为字符串
(给参数加上双引号
); - '#'的转换是在预处理期完成的,所以
只在宏定义中有效
;编译器不知道'#'
的转换作用 - 【【C进阶】25、#和##运算符】用法:
#define STRING(s) #s printf("%s\n", STRING(hello world)); 单步编译:gcc -E test.c -o test.i 中间结果:printf("%s\n", "hello world");
#+函数名
,在调用时把函数名打印出来
:#define CALL(f, p) (printf("call function: %s\n", #f), f(p))void func()
{
printf("function output");
}int main()
{
CALL(f, 1);
// C语言中如果不写参数列表,则接受任意多参数
return 0;
}
2、'##'
- '##'运算符用于在
预处理期
粘连两个字符(拼接字符
) - '##'的拼接作用是在预处理期完成的,因此
只在宏定义中有效
、编译器不知道'##'
的拼接作用 - 用法:
#define CONNECT(a, b) a##bint CONNECR(a, 1); // int a1; a1 = 2;
'##'快速定义结构体
(定义不同的类
等)// 在C语言中使用结构体必须带上struct关键字,就可以用下面的宏封装下typedef,
// 然后就可以把struct当成一个类型来用#define STRUCT(type) typedef strtuct __tag_##type type;
\
struct __tag_##type
STRTUCT(Student)
{
char* name;
int id;
};
int main()
{
Student s;
s.name = "ss";
s.id = 1;
printf("name: %s, id: %d\n"), s.name, s.id);
retrun 0;
}
本文总结自“狄泰软件学院”唐佐林老师《C语言进阶课程》。
如有错漏之处,恳请指正。
推荐阅读
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- C/C++|C/C++ basis 02
- Qt实战|Qt+OpenCV联合开发(二十一)--图像翻转与旋转
- Qt实战|Qt+OpenCV联合开发(十四)--图像感兴趣区域(ROI)的提取
- Qt实战|Qt+OpenCV联合开发(十三)--通道分离与合并
- opencv|Qt+OpenCV联合开发(十六)--图像几何形状绘制
- Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
- SNAT的MASQUERADE地址选择与端口选择
- IPTABLES的连接跟踪与NAT分析
- IPVS分析