在C++开发当中经常用到宏的定义当中使用"#"或者"##",以下是对着两种符号使用方法的简单描述:
define中的#就是把#后面的参数当做一个符号来使用,简单的说就是把它当做字符串连接起来,##连接前后2个符号, define定义中以#开头的宏直接替换不展开,以非#开头的宏先展开再替换。
如下:
#define f(a,b) a##b
#define d(a) #a
#define s(a) d(a)
puts(d(f(a,b))); 输出结果: f(a,b)
puts(s(f(a,b))); 输出结果: ab
展开的过程如下:
puts(d(f(a,b))); ----> 因为d宏的定义以#开头,宏中的参数是另外一个宏,且带##,所以作为参数的宏不展开,相当于puts(#f(a,b));----->puts("f(a,b)");
puts(s(f(a,b))); ----> 因为s宏的定义不以#开头,宏中的参数是另外一个宏,但不带##,所以作为参数的宏先展开,相当于
puts(s(ab));----->puts(d(ab));---->puts(#ab);---->puts("ab");
综上所述有以下2中情况: 1.不以"#"开头的,先展开参数a,然后是替换代码:
puts(s(f(a,b)));-->puts(s(ab))-->puts(d(ab))-->puts("ab")
2.以"#"开头的,直接替换,不展开:
puts(d(f(a,b)))-->puts("f(a,b)")