在前面我所编写的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语言语法,就是把##后的内容粘贴到##前内容后
实际的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
#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
对于JWList,实现自定义类型时,首先更改JWListElem定义,然后复制一个已有的类型如int的文件,替换_int即可。要注意JWListPrintfElem、JWListDump、JWList_CompareFunc、JWList_TraverseFunc的细微变化。JWArray类似。
C语言的另一种泛型的实现是使用void *指针,但是这样做必须在函数参数中显式的传递一个类型参数,使用不方便,具体实现请自行百度。
加入泛型的JWArray和JWList的完整源代码下载链接
原创,转载请注明来自http://blog.csdn.net/wenzhou1219