宏定义的嵌套

一般的宏嵌套展开规则是由内向外,先将内层宏展开,再把外层宏展开:

#include <stdio.h>#define A(x)    (x + 5)
#define B(x)    (x * 5)void main(void)
{
    printf("%d\r\n", B(A(2)));
}

输出:

35

嵌套宏B(A(2))会先展开为B((2 + 5)),然后再展开为((2 + 5) * 5),所以最终结果为35


如果宏的参数直接带有#,则不会展开内层的嵌套宏

#include <stdio.h>#define STR(x)      #x
#define TO_STR(x)   STR(x)
#define ADD(a, b)   (a + b)void main(void)
{
    printf("%s\r\n", STR(ADD(3, 4)));
    printf("%s\r\n", TO_STR(ADD(3, 4)));
}

输出:

ADD(3, 4)
(3 + 4)

因为STR宏的参数直接带有#,所以STR内部嵌套的内容不会被进一步展开,故STR(ADD(3, 4))输出为ADD(3, 4)

因为TO_STR宏的内容并没有#,所以嵌套的宏ADD(3, 4)依旧可以展开,故TO_STR(ADD(3, 4))输出结果为(3 + 4)


如果宏的参数直接带有##,则会先将参数通过##拼接,然后再依次进行展开

#include <stdio.h>

#define STR(x)			#x
#define TO_STR(x)		STR(x)
#define DEF_VAR(a)		var_##a
#define PARAM(x)		param_##x

void main(void)
{
    printf("%s\r\n", TO_STR(DEF_VAR(PARAM(10))));
}

输出:

var_PARAM(10)

由于DEF_VAR中带有##所以会先将里面的内容使用##拼接,所以会最先展开为TO_STR(var_PARAM(10)),由于展开后PARAM(10)已经变成了var_PARAM(10),已经不是有效的宏了,所以最终再经过TO_STR的转换后,结果就是var_PARAM(10)

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值