一、打印展开宏
方式一
.在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);