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

原创 2007年09月20日 19:20:00

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

 

 

C的宏定义实现模板函数——C的C++模板函数机制实现

近日移植TightVNC,关于RectangleUpdate的编码,处理不同色彩位深bits/pixe( 8,16,32)有着极其相似的处理方法,由于C中没有模板函数的概念,因而采用了宏定义来处理,与...
  • ARLoverKang
  • ARLoverKang
  • 2013年12月05日 09:56
  • 1751

(C++)用模板或宏实现单例模式

(C++)用模板或宏实现单例模式 http://blog.csdn.net/nono_o/article/details/43909757?ref=myread 最近在coco...
  • zdy0_2004
  • zdy0_2004
  • 2015年02月25日 00:49
  • 1714

大二队列的出队和入队分析(链式结构)C语言

大学的课程使用的是C语言 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行...
  • mihacker_
  • mihacker_
  • 2015年10月21日 16:06
  • 1371

C语言实现链队列的基本操作

这些都是之前所做的作业,这两天有时间就把它们放上来大家一起分享。
  • OnlyLove_KD
  • OnlyLove_KD
  • 2016年09月12日 09:27
  • 7498

C语言实现顺序队列的初始化、入队、出队等操作(三)

队列是一种只能在队头删除、队尾插入的线性表,本文实现队列的顺序结构,使用一个结构体包含队头指针、队尾指针、队列的长度这三个成员。通过malloc函数为队列开辟一片内存,大小为100个单位(100*数据...
  • helloworldpeople
  • helloworldpeople
  • 2017年05月20日 20:18
  • 1286

C语言实现链式队列和顺序队列

C语言实现链式队列和顺序队列。
  • fengjunwang1980
  • fengjunwang1980
  • 2016年06月21日 22:42
  • 255

C语言的艺术:强大的宏

这次不讲算法了,讲一讲C语言里面一个很强大的功能:宏。 宏,是一个大家都很熟悉的概念,很多人也经常使用宏,但是用的都不怎么深,我所知道的最常见的用法就是用宏抽象数组长度。#define N 99 a...
  • restlessssh
  • restlessssh
  • 2016年05月31日 00:06
  • 2566

关于C语言中宏定义的高级运用

1、# (stringizing)字符串化操作符。其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。 如: ...
  • u012905667
  • u012905667
  • 2014年06月01日 10:41
  • 1597

C语言中的宏展开

宏展开顺序
  • buye1986
  • buye1986
  • 2015年04月17日 18:00
  • 898

C语言宏定义作用、使用方法小结(2)

要写好C语言,漂亮的宏定义是非常重要的。宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。   在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成...
  • zhao67865
  • zhao67865
  • 2015年10月10日 11:01
  • 877
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言用宏实现模板-以队列为例
举报原因:
原因补充:

(最多只允许输入30个字)