问题
有时候我们想要用某些相似的宏初始化数组 例如:
#define PHY_BASEADDR_TYPEA1_MODULE 0xA0001000
#define PHY_BASEADDR_TYPEA2_MODULE 0xA0002000
#define PHY_BASEADDR_TYPEA3_MODULE 0xA0003000
int addrs = {PHY_BASEADDR_TYPEA1_MODULE, PHY_BASEADDR_TYPEA2_MODULE, PHY_BASEADDR_TYPEA3_MODULE};
这样写自然可以, 就是有些麻烦, 我们只希望简单将所有里面有TYPEA的初始化到数组, 可套用如下模板
样例 地址列表宏
#include <stdio.h>
//定义TYPEA 地址
#define PHY_BASEADDR_TYPEA1_MODULE 0xA0001000
#define PHY_BASEADDR_TYPEA2_MODULE 0xA0002000
#define PHY_BASEADDR_TYPEA3_MODULE 0xA0003000
//定义TYPEB 地址
#define PHY_BASEADDR_TYPEB1_MODULE 0xB0001000
#define PHY_BASEADDR_TYPEB2_MODULE 0xB0002000
#define PHY_BASEADDR_TYPEB3_MODULE 0xB0003000
#define PHY_BASEADDR_TYPEB4_MODULE 0xB0004000
#define PHY_BASEADDR_TYPEB5_MODULE 0xB0005000
#define PHY_BASEADDR_TYPEB6_MODULE 0xB0006000
//宏->列表 可以多多定义
#define _GET_MACRO_LIST_1(NAME,PRE,POST) PRE ## NAME ## 1 ## POST
#define _GET_MACRO_LIST_2(NAME,PRE,POST) _GET_MACRO_LIST_1(NAME,PRE,POST) , PRE ## NAME ## 2 ## POST
#define _GET_MACRO_LIST_3(NAME,PRE,POST) _GET_MACRO_LIST_2(NAME,PRE,POST) , PRE ## NAME ## 3 ## POST
#define _GET_MACRO_LIST_4(NAME,PRE,POST) _GET_MACRO_LIST_3(NAME,PRE,POST) , PRE ## NAME ## 4 ## POST
#define _GET_MACRO_LIST_5(NAME,PRE,POST) _GET_MACRO_LIST_4(NAME,PRE,POST) , PRE ## NAME ## 5 ## POST
#define _GET_MACRO_LIST_6(NAME,PRE,POST) _GET_MACRO_LIST_5(NAME,PRE,POST) , PRE ## NAME ## 6 ## POST
#define _GET_MACRO_LIST_7(NAME,PRE,POST) _GET_MACRO_LIST_6(NAME,PRE,POST) , PRE ## NAME ## 7 ## POST
#define _GET_MACRO_LIST_8(NAME,PRE,POST) _GET_MACRO_LIST_7(NAME,PRE,POST) , PRE ## NAME ## 8 ## POST
#define _GET_MACRO_LIST_9(NAME,PRE,POST) _GET_MACRO_LIST_8(NAME,PRE,POST) , PRE ## NAME ## 9 ## POST
//转换拼接
#define CAT(a, ...) a ## __VA_ARGS__
#define _GET_MACRO_LIST(NAME,PRE,POST,COUNT) CAT( _GET_MACRO_LIST_, COUNT )(NAME,PRE,POST)
//长度定义
#define NUMBER_OF_TYPEA_MODULE 3
#define NUMBER_OF_TYPEB_MODULE 6
//地址列表宏
#define PHY_BASEADDR_LIST(NAME) _GET_MACRO_LIST( NAME, PHY_BASEADDR_ , _MODULE, NUMBER_OF_ ## NAME ## _MODULE )
int main(int argc, char **argv)
{
//初始化
int addrs_TYPEA[] = { PHY_BASEADDR_LIST( TYPEA ) };
int addrs_TYPEB[] = { PHY_BASEADDR_LIST( TYPEB ) };
int i;
//打印
for(i=0;i<NUMBER_OF_TYPEA_MODULE;i++) {
printf("TYPEA %d adr = %#X\n", i, addrs_TYPEA[i]);
}
printf("-----------------------------------------\n");
for(i=0;i<NUMBER_OF_TYPEB_MODULE;i++) {
printf("TYPEB %d adr = %#X\n", i, addrs_TYPEB[i]);
}
return 0;
}