#define B C #define A B #define test(x,y) test1(x,y) #define test1(x,y) x ## y /*!TEST1: !*/ test(A,C) /*!TEST2: !*/ test1(A,C)
(一) 首先用实参替换形参,将实参代入宏文本中, 将实参代入宏文本后,。spa
(二) 若是遇到字符“#”或“##”,即便实参是宏,也再也不展开实参,而是看成文本处理;不然若是实参也是宏,则展开实参;code
(三) 最后再继续处理宏替换后的宏文本,若宏文本也包含宏则继续展开,不然完成展开。blog
/*! TEST1 !*/class
(1)首先使用实参替换形参,将实参带入宏文本test
test(A,C) (1)==> test1(A,C) 文本处理
(2)若是实参也是宏,则展开实参.di
test1(A,C) (2)==> test1(B,C)co
test1(B,C) (2)==> test1(C,C)字符
(3)继续处理宏替换后的宏文本,若宏文本也包含宏则继续展开,不然展开完成
test1(C,C) (3)(1)==> C ## C
C ## C (3)(2)==> C ## C
C ## C (3)(3)==> CC
/*! TEST2 !*/
(1)首先使用实参替换形参
test1(A,C) (1)==> A ## C
(2)若是遇到#或者##,即便实参是宏也不展开,看成文本处理.
A ## C (1)==> A ## C
(3)继续处理宏替换后的文本宏,若宏文本也包含宏则继续展开,不然展开完成
A ## C (3)(1)==> AC