#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