c语言宏定义常量可以自增吗,请教大家一个C语言的宏的递归完成自增定义的方法...

思路这这样的:

为了测试,需要一个数据块,数据的形式是0x55aa0000,0x55aa0001,0x55aa0002,0x55aa0003 。。。,共n*4个字节,如果放在ram中太浪费,就想直接生成到flash

笨办法就是直接写死,比如

const uint32_t DATA[60]={0x55aa0000,0x55aa0001,0x55aa0002,0x55aa0003 。。。,0x55aa003F};

但是为了能方便调整大小,就考虑用宏递归,而且最好前面的0x55aa也能用宏定义

在asf中有如下的宏

/*! \brief Macro repeat.

*

* This macro represents a horizontal repetition construct.

*

* \param count  The number of repetitious calls to macro. Valid values range from 0 to MREPEAT_LIMIT.

* \param macro  A binary operation of the form macro(n, data). This macro is expanded by MREPEAT with

*               the current repetition number and the auxiliary data argument.

* \param data   Auxiliary data passed to macro.

*

* \return       macro(0, data) macro(1, data) ... macro(count - 1, data)

*/

#define TPASTE2( a, b)                            a##b

#define MREPEAT(count, macro, data)         TPASTE2(MREPEAT, count)(macro, data)

#define MREPEAT0(  macro, data)

#define MREPEAT1(  macro, data)       MREPEAT0(  macro, data)   macro(  0, data)

#define MREPEAT2(  macro, data)       MREPEAT1(  macro, data)   macro(  1, data)

#define MREPEAT3(  macro, data)       MREPEAT2(  macro, data)   macro(  2, data)

#define MREPEAT4(  macro, data)       MREPEAT3(  macro, data)   macro(  3, data)

#define MREPEAT5(  macro, data)       MREPEAT4(  macro, data)   macro(  4, data)

#define MREPEAT6(  macro, data)       MREPEAT5(  macro, data)   macro(  5, data)

#define MREPEAT7(  macro, data)       MREPEAT6(  macro, data)   macro(  6, data)

。。。。

#define MREPEAT256(macro, data)       MREPEAT255(macro, data)   macro(255, data)

然后我用这个宏来生成自增定义

#define KEY_HEADER 0x55aa0000

#define X 16

#define Y 4

#define KEY_SIZE X*Y

#define KEY_HEADER_PLUS(c,d) c+d,

const uint32_t DATA[KEY_SIZE]={ // 160 bytes = 40 words

MREPEAT(KEY_SIZE, KEY_HEADER_PLUS, KEY_HEADER)

};

期望得到的结果是:

const uint32_t DATA[KEY_SIZE]={ // 160 bytes = 40 words

0x55aa0000,0x55aa0001,0x55aa0002,0x55aa0003 。。。,0x55aa003F,

};

但是上面的那段程序总是报错,无法通过编译

pasting "MREPEAT" and "(" does not give a valid preprocessing token

不知道问题出在哪里?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值