c语言用宏实现模板-以队列为例

1. 队列类型及操作的宏定义:


// 队列类型表示:Queue_元素类型(如元素为整形的队列类型为:Queue_int)
// _ET:元素类型
#define Q_TYPE(_ET)Queue_##_ET

// 队列变量定义:每个队列对应一个数组,用于存放元素,数组名表示成:qBuf##queue
// 在定义队列变量时需指定队列长度:由len指定
// ET:元素类型
// queue:队列变量名
// len:队列长度
#define Q_DEFINE(ET,queue,len)
ETqBuf##queue[len];
int qBufLen##queue = sizeof (ET) * len;
Q_TYPE(ET)queue

// 队列类型(结构体)定义:
// ET:元素类型
// Queue_##ET:具体化后的队列类型,由不同的元素类型决定
#define Q_TYPE_DEFINE(ET)
typedef
struct
... {
ET
*pElems;
intfront,rear,size;
intmaxSize;
}
Queue_##ET;

// 队列变量声明表示:用于声明外部全局变量
// ET:元素类型
// queue:队列变量名
#define Q_EXTERN(ET,queue)
extern ETqBuf##queue[];
extern int qBufLen##queue;
extern Q_TYPE(ET)queue

// 队列初始化
#define Q_INIT(queue,len)
... {
memset(qBuf##queue,
0,qBufLen##queue);
queue.pElems
=qBuf##queue;
queue.size
=0;
queue.front
=queue.rear=0;
queue.maxSize
=len;
}


// 队空
#define Q_EMPTY(queue)(queue.front==queue.rear)

// 队满
#define Q_FULL(queue)((queue.rear+1)%queue.maxSize==queue.front)

// 入队
#define Q_PUT(queue,pput)
... {
if(Q_FULL(queue))
...{
Uart_Printf(
"MQOF ");
}

else
...{
queue.pElems[queue.rear]
=*pput;
queue.size
++;
queue.rear
=(queue.rear+1)%queue.maxSize;
}

}


// 出队
#define Q_GET(queue,pget)
... {
if(queue.front==queue.rear)
...{
pget
=NULL;
}

else
...{
inthead=queue.front;
queue.front
=(queue.front+1)%queue.maxSize;
pget
=&queue.pElems[head];
queue.size
--;
}

}


// 队列类型实例化:根据指定的不同类型
Q_TYPE_DEFINE(sGUI_MESSAGE) // 消息队列
Q_TYPE_DEFINE( char )

2.定义队列:

// 定义队列长度
#define MSG_QUEUE_LEN100 // 预定义消息队列的长度
#define KBD_BUF_LEN10

// 定义队列变量
Q_DEFINE(sGUI_MESSAGE,msgQueue,MSG_QUEUE_LEN);
Q_DEFINE(
char ,keyQueue,KBD_BUF_LEN);

// 显式初始化
void q_init()
... {
Q_INIT(msgQueue,MSG_QUEUE_LEN);
Q_INIT(keyQueue,KBD_BUF_LEN);
}

3.外部引用队列变量:

// 外部引用,使用声明Q_EXTERN表达式
Q_EXTERN(sGUI_MESSAGE,msgQueue);
Q_EXTERN(
char ,keyQueue);

4.操作队列:

int i = 65 ;
while ( ! Q_FULL(keyQueue))
... {
Q_PUT(keyQueue,
&i);
i
++;
}


char * pch;
while ( ! Q_EMPTY(keyQueue))
... {
Q_GET(keyQueue,pch);
if(pmsg)
printf(
"%c ",*pch);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值