天天看点

11.C语言泛型的支持

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

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

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

这里我们编写一个int类型的maxcount_int函数和一个double类型的maxcount_double函数

在实际调用的时候用maxcount(type)宏来完成链接到不同类型的实现上

注意这里##的用法,这是比较偏僻的c语言语法,就是把##后的内容粘贴到##前内容后

实际的jwarray的泛型定义如下

实际的jwlist泛型定义如下

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

对于jwlist,实现自定义类型时,首先更改jwlistelem定义,然后复制一个已有的类型如int的文件,替换_int即可。要注意jwlistprintfelem、jwlistdump、jwlist_comparefunc、jwlist_traversefunc的细微变化。jwarray类似。

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

加入泛型的jwarray和jwlist的完整源代码

原创,转载请注明来自

继续阅读