1、##是一个连接符号,用于把参数连在一起
例如:
> #define FOO(arg) my##arg
则
> FOO(abc)
相当于 myabc
2、#是“字符串化”的意思。出现在宏定义中的#是把跟在后面的参数转换成一个字符串
例如:
> #define STRCPY(dst, src) strcpy(dst, #src)
则
> STRCPY(buff, abc)
相当于 strcpy(buff, "abc")
3、另外,如果##后的参数本身也是一个宏的话,##会阻止这个宏的展开 。如:
#define STRCPY(a, b) strcpy(a ## _p, #b)
STRCPY( STRCPY( var1 , var2 ) , var2 );
这里是否会展开为: strcpy(strcpy(var1_p,"var2")_p,"var2“)呢?
答案是否定的,展开结果将是: strcpy( STRCPY( var1 , var2 )_p,"var2" )
如果宏定义的参数中存在 ##和#,那么参数中的宏定义不会展开!
当然如果宏定义里没有用到 # 和 ##, 宏将会完全展开。