C语言 把定义的宏根据名称规则转换为列表

问题

有时候我们想要用某些相似的宏初始化数组 例如:

#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;
}

效果 可以看到这样就方便不少

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Potcutre

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值