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

本文介绍了一种通过宏定义实现队列数据结构的方法。详细解释了如何定义不同类型的队列,包括消息队列和字符队列,并展示了队列的初始化、入队和出队等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


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

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

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

//队列变量声明表示:用于声明外部全局变量
//ET:元素类型
//queue:队列变量名
#defineQ_EXTERN(ET,queue)
externETqBuf##queue[];
externintqBufLen##queue;
externQ_TYPE(ET)queue

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


//队空
#defineQ_EMPTY(queue)(queue.front==queue.rear)

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

//入队
#defineQ_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;
}

}


//出队
#defineQ_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.定义队列:

//定义队列长度
#defineMSG_QUEUE_LEN100//预定义消息队列的长度
#defineKBD_BUF_LEN10

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

//显式初始化
voidq_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.操作队列:

inti=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、付费专栏及课程。

余额充值