11.C语言泛型的支持

来源:互联网 发布:京都特色民宿酒店知乎 编辑:程序博客网 时间:2024/04/30 06:10

1.C语言泛型实现


在前面我所编写的JWArray和JWList都是只能写定一种类型,那么为了在实际中使用方便,很自然想到类似C++中的泛型支持功能,C++中使用模板技术来实现泛型,但是在C中是不支持模板技术的,怎么来实现泛型呢?

如果你了解一点C++的模板技术的话,就知道其实这里的C++模板技术最简单的实现就是编译器对每一种类型都实现一次,然后调用的时候链接到不同类型的实现。那么既然这里C语言编译器本身不支持模板技术,那么我们就用手工来实现每一种类型的函数,然后在实际调用的时候直接链接到对应类型的函数即可。

最简单的C语言泛型实现如下

#include <stdio.h>#define maxcount(type)maxcount_##typedouble 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


0 0
原创粉丝点击