C++打印展开宏和嵌套宏

一、打印展开宏

 

 方式一

.在linux下,例如main.c中使用宏,使用gcc -E main > main.i   main.i中即可查看展开的宏定义了。

#include <stdio.h>

#define FUNC(a,b) (a)+(b)
#define GET_MACRO(_1,_2,NAME,...) NAME
int main()
{

        FUNC(5,5);
        return 0;
}

 方式二

#include <stdio.h>
#include <iostream>

#define MACRO_STRING(x) #x
#define MACRO_EXPAND(x) MACRO_STRING(x)
#define FUNC(a,b) (a)+(b)
#define GET_MACRO(_1,_2,NAME,...) NAME
int main()
{


        printf(MACRO_EXPAND(FUNC(5,5)));
        printf("\n");
        return 0;
}

二.嵌套宏

    

#define TOKEN_TO_STR1(s) #s
#define TOKEN_TO_STR(s) TOKEN_TO_STR1(s)

#define INIT_MEMBER_MAP1_1(attr) MemberMap[TOKEN_TO_STR(attr)] = &attr
#define INIT_MEMBER_MAP1_2(attr1, attr2) MemberMap[TOKEN_TO_STR(attr1)] = &attr2

#define GET_MACRO(_1,_2,NAME,...) NAME
#define INIT_MEMBER_MAP1(...) GET_MACRO(__VA_ARGS__, INIT_MEMBER_MAP1_2, INIT_MEMBER_MAP1_1)(__VA_ARGS__);
#define INIT_MEMBER_MAP2(...) GET_MACRO(__VA_ARGS__, INIT_MEMBER_MAP2_2, INIT_MEMBER_MAP2_1)(__VA_ARGS__);
  • 宏在解析的时候,碰到第二层宏,会先展开x,再传递下去。
  • 当一个宏含有传入参数的时候,如果调用是没有带参数,那么将类似于表面定义,如INIT_MEMBER_MAP1_2 没有带参数 ,那么类似于#define INIT_MEMBER_MAP1_2

假设INIT_MEMBER_MAP1参数时abc那么:

   1.GET_MACRO(abc, INIT_MEMBER_MAP1_2, INIT_MEMBER_MAP1_1)(abc); 其中  GET_MACRO展开为:

        GET_MACRO(_1, _2, INIT_MEMBER_MAP1_1)  INIT_MEMBER_MAP1_1   ======>  INIT_MEMBER_MAP1_1   

   2.最终为INIT_MEMBER_MAP1_1(abc);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值