1.C语言泛型实现
在前面我所编写的JWArray和JWList都是只能写定一种类型,那么为了在实际中使用方便,很自然想到类似C++中的泛型支持功能,C++中使用模板技术来实现泛型,但是在C中是不支持模板技术的,怎么来实现泛型呢?
如果你了解一点C++的模板技术的话,就知道其实这里的C++模板技术最简单的实现就是编译器对每一种类型都实现一次,然后调用的时候链接到不同类型的实现。那么既然这里C语言编译器本身不支持模板技术,那么我们就用手工来实现每一种类型的函数,然后在实际调用的时候直接链接到对应类型的函数即可。
最简单的C语言泛型实现如下
#include <stdio.h>
#define maxcount(type) maxcount_##type
double maxcount_double(double a, double b)
{
return a > b ? a : b;
}
int maxcount_int(int a, int b)
{
return a > b ? a : b;
}
int main(int argc, char *argv[])
{
printf("int max:%d\ndouble max:%f\n", maxcount(int)(2,3), maxcount(double)(52.4,32.2));
return 0;
}
这里我们编写一个int类型的maxcount_int函数和一个double类型的maxcount_double函数
在实际调用的时候用maxcount(type)宏来完成链接到不同类型的实现上
注意这里##的用法,这是比较偏僻的C语言语法,就是把##后的内容粘贴到##前内容后
2.JWArray的泛型定义
实际的JWArray的泛型定义如下
#ifndef JWARRAY_H_H_H
#define JWARRAY_H_H_H
#include "JWArray_base.h"
#include "JWArray_int.h"
#include "JWArray_char.h"
#include "JWArray_double.h"
#include "JWArray_float.h"
#define JWArrayElem(type) JWArrayElem_##type
#define JWArray(type) JWArray_##type
//基础线性表函数声明
#define JWArrayCreate(type) JWArrayCreate_##type
#define JWArrayDestroy(type) JWArrayDestroy_##type
#define JWArrayMakeEmpty(type) JWArrayMakeEmpty_##type
#define JWArrayIsEmpty(type) JWArrayIsEmpty_##type
#define JWArrayIsFull(type) JWArrayIsFull_##type
#define JWArrayGetLength(type) JWArrayGetLength_##type
#define JWArrayGetAt(type) JWArrayGetAt_##type
#define JWArraySetAt(type) JWArraySetAt_##type
#define JWArrayInsert(type) JWArrayInsert_##type
#define JWArrayDelete(type) JWArrayDelete_##type
#define JWArrayLocate(type) JWArrayLocate_##type
#define JWArrayTraverse(type) JWArrayTraverse_##type
#define JWArrayPrintfElem(type) JWArrayPrintfElem_##type
#define JWArrayDump(type) JWArrayDump_##type
#define JWArray_CompareFunc(type) JWArray_CompareFunc_##type
#define JWArray_TraverseFunc(type) JWArray_TraverseFunc_##type
//栈操作函数声明
#define JWArrayGetTop(type) JWArrayGetTop_##type
#define JWArraySetTop(type) JWArraySetTop_##type
#define JWArrayPush(type) JWArrayPush_##type
#define JWArrayPop(type) JWArrayPop_##type
//队列操作函数声明
#define JWArrayGetHead(type) JWArrayGetHead_##type
#define JWArraySetHead(type) JWArraySetHead_##type
#define JWArrayEnQueue(type) JWArrayEnQueue_##type
#define JWArrayDeQueue(type) JWArrayDeQueue_##type
#endif
3.JWList的泛型定义
实际的JWList泛型定义如下
#ifndef JWLIST_H_H_H
#define JWLIST_H_H_H
#include "JWList_base.h"
#include "JWList_int.h"
#include "JWList_char.h"
#include "JWList_double.h"
#include "JWList_float.h"
#define JWListElem(type) JWListElem_##type
#define JWListNode(type) JWListNode_##type
#define PJWListNode(type) PJWListNode_##type
#define JWList(type) JWList_##type
#define PJWList(type) PJWList_##type
/************************************************************************/
/* 基本线性表函数声明 */
/************************************************************************/
#define JWListCreateFromHead(type) JWListCreateFromHead_##type
#define JWListCreateFromTail(type) JWListCreateFromTail_##type
#define JWListDestroy(type) JWListDestroy_##type
#define JWListMakeEmpty(type) JWListMakeEmpty_##type
#define JWListIsEmpty(type) JWListIsEmpty_##type
#define JWListGetLength(type) JWListGetLength_##type
#define JWListGetAt(type) JWListGetAt_##type
#define JWListSetAt(type) JWListSetAt_##type
#define JWListInsert(type) JWListInsert_##type
#define JWListDelete(type) JWListDelete_##type
#define JWListLocate(type) JWListLocate_##type
#define JWListTraverse(type) JWListTraverse_##type
#define JWListGetPrior(type) JWListGetPrior_##type
#define JWListPrintfElem(type) JWListPrintfElem_##type
#define JWListDump(type) JWListDump_##type
#define JWList_CompareFunc(type) JWList_CompareFunc_##type
#define JWList_TraverseFunc(type) JWList_TraverseFunc_##type
/************************************************************************/
/* 栈操作函数声明 */
/************************************************************************/
#define JWListSetTop(type) JWListSetTop_##type
#define JWListGetTop(type) JWListGetTop_##type
#define JWListPush(type) JWListPush_##type
#define JWListPop(type) JWListPop_##type
/************************************************************************/
/* 队列操作函数声明 */
/************************************************************************/
#define JWListSetHead(type) JWListSetHead_##type
#define JWListGetHead(type) JWListGetHead_##type
#define JWListEnQueue(type) JWListEnQueue_##type
#define JWListDeQueue(type) JWListDeQueue_##type
#endif
4.JWArray和JWList使用说明
对于JWList,实现自定义类型时,首先更改JWListElem定义,然后复制一个已有的类型如int的文件,替换_int即可。要注意JWListPrintfElem、JWListDump、JWList_CompareFunc、JWList_TraverseFunc的细微变化。JWArray类似。
C语言的另一种泛型的实现是使用void *指针,但是这样做必须在函数参数中显式的传递一个类型参数,使用不方便,具体实现请自行百度。
加入泛型的JWArray和JWList的完整源代码下载链接
原创,转载请注明来自http://blog.csdn.net/wenzhou1219