#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)
(一) 首先用实参替换形参,将实参代入宏文本中, 将实参代入宏文本后,。
(二) 如果遇到字符“#”或“##”,即使实参是宏,也不再展开实参,而是当作文本处理;否则如果实参也是宏,则展开实参;
(三) 最后再继续处理宏替换后的宏文本,若宏文本也包含宏则继续展开,否则完成展开。
/*! TEST1 !*/
(1)首先使用实参替换形参,将实参带入宏文本
test(A,C) (1)==> test1(A,C)
(2)如果实参也是宏,则展开实参.
test1(A,C) (2)==> test1(B,C)
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