首页 > 代码库 > 11.C语言泛型的支持

11.C语言泛型的支持

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使用说明


这里的JWArray和JWList最基本的都支持double、float、char、int类型的支持,支持自定义类型。

对于JWList,实现自定义类型时,首先更改JWListElem定义,然后复制一个已有的类型如int的文件,替换_int即可。要注意JWListPrintfElem、JWListDump、JWList_CompareFunc、JWList_TraverseFunc的细微变化。JWArray类似。




C语言的另一种泛型的实现是使用void *指针,但是这样做必须在函数参数中显式的传递一个类型参数,使用不方便,具体实现请自行百度。

加入泛型的JWArray和JWList的完整源代码下载链接

原创,转载请注明来自http://blog.csdn.net/wenzhou1219