本文共 993 字,大约阅读时间需要 3 分钟。
\ 行继续操作符
这是我们宏定义的时候经常会使用的符号,有些时候我们定义的宏可能比较复杂,定义的宏不能用一行表达完整时,需要用"\"表示换行继续宏的定义,不使用"\"不能编译通过,而且这样能够使宏的定义美观易读。
# 字符串化操作符
将宏定义中的传入参数名转换成用一对双引号括起来的参数名字符串。通俗的讲就是不管传入的是什么参数,都将是一个字符串。只能用于有传入参数的宏定义中,必须置于宏定义体中的参数名前。当传入参数名前面和后面有空格时将被忽略;当传入参数名间存在空格时,编译器会自动连接各个子字符串,每个子字符串中只保留一个空格。
比如定义了以下宏:
#define test(str) #str
使用宏定义:
std::string str = test(zhai nan) 其实等价于 std::string str = “zhai nan”
## 符号连接操作符
把宏参数名与宏定义代码序列中的标识符连接在一起,形成一个新的标识符。当用##连接形参时,##前后的空格可有可无;连接后的实际参数名,必须为实际存在的参数名或是编译器已知的宏定义。
#@ 字符化操作符。
将传入的单字符参数名转换成字符,用单引用括起来。只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前,这个操作符其实并不常用。
比如定义了以下宏:
#define tochar(x) #@x
a = tochar(b) 其实等价于 a = 'b';
代码实例:
#include#define sum(a , b) #define test1(num) \ std::cout << #num " = " << num << std::endl;#define test2(num) \ test1(a##num);#define tochar(x) #@xint main(int argc, char* argv[]){ int a = 10; int a1 = 1, a2 = 2, a3 = 3; test1(a); test2(1); test2(2); test2(3); system("pause");}
执行结果:
--END--
个人微信公众号“IT集装箱”目前正在吸粉阶段,欢迎搜索加关注,获取更多精彩IT技术知识内容分享!
转载地址:http://beiii.baihongyu.com/