宏展开顺序

参考自1

宏展开顺序

宏展开顺序大致可以归结为:
第一步:首先用实参代替形参,将实参代入宏文本中
第二步:如果实参也是宏,则展开实参
第三步:最后继续处理宏替换后的宏文本,如果仍包含宏,则继续展开
注意:如果在第二步,实参代入宏文本后,实参之前或之后遇到#或##,实参不再展开

例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)以及3到宏文本a ## b中;
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
首先代入实参xcat(1, 2)以及3到宏文本cat(x, y)
发现实参xcat(1, 2)也是一个宏,则继续进行实参的宏展开;
发现实参cat(x, y)也是一个宏,则继续进行实参的宏展开;
在例2中,虽然也生成的cat(cat(1, 2), 3),这里是位于中间过程,例2中首先执行实参的宏展开cat(1, 2), 所以结果和例1不一样。

例2中以下顺序是错的:
xcat(xcat(1,2), 3) --> cat(xcat(1, 2), 3) --> xcat(1, 2) ## 3 -->xcat(1, 2)3
展开后的宏文本中还包含宏,优先进行宏参数xcat(1, 2)的展开。

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

int  main()
{

   cat(cat(1,2),3);

   xcat(xcat(1,2),3);

   xcat(cat(1,2),3);

    return 0;
}

预编译展开后得到

int main()
{
    cat(1,2)3;

    123;

    123;
    
    return 0;
}

  1. https://blog.csdn.net/buye1986/article/details/45100339 ↩︎

猜你喜欢

转载自blog.csdn.net/FJDJFKDJFKDJFKD/article/details/83385708