宏的三个运算符
1)#,让值序列变为一个字符串。
#define str(x) #x
调用时,如使用str(abc),展开后变为"abc"。
如使用str("abc"),展开后变为"/"abc/""。
2)##,将前后两个的单词拼接在一起。
#define cat(x,y) x##y
调用时,如使用int cat(a,1) = 0;。展开后变为int a1 = 0;
3)#@,将值序列变为一个字符。
#define ch(x) #@x
调用时,如使用ch(a),展开后变为'a'。
如使用ch(abc),展开后变为'abc'。此时对于MSVC,'abc'将作为一个signed int值来处理。即0x616263。
(扯:若超过32位大小,如int a = 'abcde',编译器会报错,指示常量中字符太多。)
××××××××××××××××××××××××××××××××××××××××××××××××××××××
若调用宏中带有#或者##操作,参数宏不会被展开。例如:
#define cat(x,y) x##y
若这样调用cat(cat(x,y),z),结果是编译器报错。参数宏cat(x,y)不会被展开,结果是生成了cat(x,y)z,自然报错。
另一个例子:
#define str(x) #x
#define cat(a,b) a##b
调用str(cat(a,b)),得到结果是"cat(a,b)"。
解决问题的方法,是提供另一个宏。
#define conn(x,y) x##y
#define cat(x,y) conn(x,y)
调用时,若使用cat(cat(x,y),z),参数宏会按照调用者的意愿变为xy,最后展开的结果变为xyz。
值得注意的是,对于带参数列表的宏,只有当一对圆括号括起来时,宏才会被展开。
×××××××××××××××××××××××××××××××××××××××××××××××××××××××
在展开的过程中,如果遇到相同的宏标示,宏的展开会停止。例如:
#define A A+1
结果停留在A+1。