结构体保留字段定义

使用结构体时常为了对齐或匹配需要定义一些保留字段,比如定义一个结构体来描述某设备寄存器,因为寄存器本身不是连续的所以在空缺位置要定义保留字段,如下所示:

typedef struct {
    volatile UINT16  fifo;
    volatile UINT16  ucsr;
    volatile UINT16  recerved0;
    volatile UINT16  mcr;
    volatile UINT16  recerved1;
    volatile UINT16  baud;
    volatile UINT16  fsr;
} FPGA_UART_REGS;

尤其是在有多个保留字段时,命名又不能重复,写起来会略麻烦。
这里利用宏定义实现了一种用法简单的保留字段定义宏 RESERVED(size)

#define RESERVED_1(type, name, line, size)      type  name##line[size]
#define RESERVED_0(line, size)                  RESERVED_1(char, recerved, line, size)
#define RESERVED(size)                          RESERVED_0(__LINE__, size)

利用 RESERVED(size)重新定义上面的结构体:

typedef struct {
    volatile UINT16  fifo;
    volatile UINT16  ucsr;
    volatile RESERVED(2);
    volatile UINT16  mcr;
    volatile RESERVED(2);
    volatile UINT16  baud;
    volatile UINT16  fsr;
} FPGA_UART_REGS;

RESERVED(2)的展开过程如下:

volatile RESERVED(2); 
--> volatile RESERVED_0(__LINE__, size); 
--> volatile RESERVED_1(char, recerved, __LINE__, 2);
--> volatile  char recervedxxx[2]; //xxx为宏__LINE__对应的行号

比如结构体的起始行号为100,则展开后的结构体为:

100:	typedef struct {
101:		volatile UINT16  fifo;
102:		volatile UINT16  ucsr;
103:	    volatile char    recerved103[2];
104:	    volatile UINT16  mcr;
105:	    volatile char    recerved105[2];
106:	    volatile UINT16  baud;
107:	    volatile UINT16  fsr;
108:	} FPGA_UART_REGS;

这样使用同一个宏 RESERVED(size)配合需要保留的字节数就可以任意定义保留字段而不需要考虑命名问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ScilogyHunter

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

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

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

打赏作者

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

抵扣说明:

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

余额充值