您的位置:首页 > 编程语言 > C语言/C++

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

2011-05-10 12:46 225 查看
1. 队列类型及操作的宏定义:




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


//_ET:元素类型


#define Q_TYPE(_ET) Queue_##_ET




//队列变量定义:每个队列对应一个数组,用于存放元素,数组名表示成:qBuf##queue


//在定义队列变量时需指定队列长度:由len指定


//ET: 元素类型


//queue: 队列变量名


//len: 队列长度


#define Q_DEFINE(ET,queue,len)


ET qBuf##queue[len];


int qBufLen##queue = sizeof(ET)*len;


Q_TYPE(ET) queue




//队列类型(结构体)定义:


//ET: 元素类型


//Queue_##ET: 具体化后的队列类型,由不同的元素类型决定


#define Q_TYPE_DEFINE(ET)


typedef struct


{


ET* pElems;


int front, rear, size;


int maxSize;


}Queue_##ET;




//队列变量声明表示: 用于声明外部全局变量


//ET: 元素类型


//queue: 队列变量名


#define Q_EXTERN(ET, queue)


extern ET qBuf##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


{


int head = 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_LEN 100 // 预定义消息队列的长度


#define KBD_BUF_LEN 10




//定义队列变量


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);


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: