不是先替换参数,再展开外层宏。(虽然这样叙述容易理解,而且大部分情况下也没错) 是再替换外层宏的同时,用于替换宏参数的内容是参数宏展开的结果。 所以: #define MUX_WITH_COMMA(contain_comma, a, b) CHOOSE2nd(contain_comma a, b) 对以下调用: MUX_WITH_COMMA(concat(__P_DEF_, 1), a, b) ~~~~~~~~~~~~~~~~~~~ 展开为 __P_DEF_1 继续展开为 X, 所以展开结果(`CHOOSE2nd(conatin_comma a,b)`)中的 contain_comma 被替换为 `X,`。最终结果为: CHOOSE2nd(conatin_comma a, b) ~~~~~~~~~~~~~ CHOOSE2nd(X, a, b) ~~~~~~~~~~~~~