C++ 宏展开顺序

宏展开顺序大致可以归结为:

第一步:首先用实参代替形参,将实参代入宏文本中

第二步:如果实参也是宏,则展开实参

第三步:最后继续处理宏替换后的宏文本,如果仍包含宏,则继续展开

注意:如果在第二步,实参代入宏文本后,实参之前或之后遇到#或##,实参不再展开

例1:

#define cat(a,b) a ## b

宏调用:cat(cat(1, 2), 3) 的展开顺序为:

cat(cat(1, 2), 3) -->cat(1, 2) ## 3  -->cat(1, 2)3

cat(1,2)仍是宏,但后面是##,不再展开,结果为:cat(1, 2)3

例2:

#define  cat(a,b)   a ## b

#define  xcat(x, y)   cat(x, y)

宏调用 xcat(xcat(1, 2), 3) 的展开顺序为:

xcat(xcat(1,2), 3) -->cat(xcat(1, 2), 3) -->cat(cat(1, 2), 3) -->cat(1 ## 2, 3) --> 1 ##2 ## 3 -->123

务必注意参数的处理顺序,第二步在第三步前面执行,第一层宏展开后,实参是宏,则首先处理实参的宏展开,即使宏替换后本身也是宏。在例2中,虽然也生成的cat(cat(1, 2), 3),但是是首先执行里面的cat(1, 2), 所以结果不一样。例2中以下顺序是错的:

xcat(xcat(1,2), 3) --> cat(xcat(1, 2), 3) --> xcat(1, 2) ## 3 -->xcat(1, 2)3



转载:https://www.cnblogs.com/hjbf/p/11989585.html

posted @ 2025-04-25 22:44  double64  阅读(52)  评论(0)    收藏  举报