#define F abc
#define B def
#define FB(arg) #arg
#define FB1(arg) FB(arg)
//#define FB2(F B) FB(arg)
#define f(a, b) a##b
#define g(a) #a
#define h(a) g(a)
//考察字符串化操作符#得作用得执行过程,以及宏定义替换的次序。//如果该宏为带#号的宏定义,则直接替换字符串,无需再嵌套替换,
//如果该宏不是带#的宏,则先替换括号内部的宏定义,然后替换外部的。
#define warn_if(x)\
do{\
if(x)\
printf("warn "#x"\n");\
}while(0);
#define MS( x ) Stud##x
#define STRING(x) #x#x#x
#define TEXT(x) "class"#x"Info"
#define cat(a,b) a ## b
#define ff(a) fff a
#define ab AB
char *a = "hello," "world";
qDebug()<<strlen(a);
/*
11
*/
qDebug()<<FB(1+2);
qDebug()<<FB1(1+2);
/*
1+2
1+2
*/
//考察字符串化操作符#得作用得执行过程,以及宏定义替换的次序。
//如果该宏为带#号的宏定义,则直接替换字符串,无需再嵌套替换,
//如果该宏不是带#的宏,则先替换括号内部的宏定义,然后替换外部的。
qDebug()<<h(f(1,2));
qDebug()<<g(f(1,2));
/*
12
f(1,2)
*/
int eric=3;
warn_if(eric==3);
/*
warn eric==3
*/
qDebug()<<h(1+2);
qDebug()<<g(1+2);
/*
1+2
1+2
*/
int abc = 100;
qDebug()<<STRING(abc);
qDebug()<<TEXT(abc);
/*
abcabcabc
classabcInfo
*/
//报错
// qDebug()<<cat(cat(1,2),3);
// qDebug()<<cat(a,b);
// qDebug()<<ff(cat(cat(1,2),3));
// qDebug()<<QString::asprintf("%s", 10); //不打印
qDebug()<<cat(1,2);
/*
12
*/