#用于含有参数的宏定义中,用于把参数字符化
#define STR(a) #a
STR(a)会被替换为“a"
STR(c)会被替换为"c"
##用于拼接标识符
#define CON a##b
int ab=1;
cout<<CON;//等价于cout<<ab;
#define CON(a,b) a##b
cout<<CON(1,2);//等价于cout<<12;
另外##还可以用于可变参数宏定义中;
#define f1(format,...) fprintf(stderr,format,__VA_ARGS__)
#define f2(format,args...) fprintf(stderr,format,args)//vs不支持,GNU支持
上面两个宏定义都是可变参数宏定义,如果省略可变参数,
比如f1(“hello”),vs不报错,但是GNU报错;
可以"##_VA_ARGS_“,”##args"这样写。这样GNU编译器可以通过。