嗨,
当我为课堂作业实现一些程序时,我突然想到使用 C 以通用方式实现相同的程序。
我确实知道我们需要使用 void 指针和函数,但我只是不知道该怎么做。请给我一个简单的例子并演示用法。
比如如何实现一个比较函数来实现一个比较排序,或者插入一个链表,其中每个节点都有一个不同类型的元素等......
PS:任何指向其他问题或文章的链接都是有帮助和欢迎的。
嗨,
当我为课堂作业实现一些程序时,我突然想到使用 C 以通用方式实现相同的程序。
我确实知道我们需要使用 void 指针和函数,但我只是不知道该怎么做。请给我一个简单的例子并演示用法。
比如如何实现一个比较函数来实现一个比较排序,或者插入一个链表,其中每个节点都有一个不同类型的元素等......
PS:任何指向其他问题或文章的链接都是有帮助和欢迎的。
好吧,显然一种参数化类型的方法是使用预处理器,例如:
#define DIVIDE_FUNC(type) divide_##type
#define DIVIDE_CALL(type, a, b) DIVIDE_FUNC(type)((a), (b))
#define DIVIDE_DECL(type) type DIVIDE_FUNC(type)(type a, type b)
#define DIVIDE_IMPLEMENTATION DIVIDE_DECL(DIVIDE_TYPE) { return a / b; }
#define DIVIDE_TYPE int
DIVIDE_IMPLEMENTATION
#undef DIVIDE_TYPE
#define DIVIDE_TYPE double
DIVIDE_IMPLEMENTATION
#include <stdio.h>
int main (void) {
int i = 5, j = 2;
(void) printf("int %d / %d = %d\n", i, j, DIVIDE_CALL(int, i, j));
(void) printf("double %d / %d = %f\n", i, j, DIVIDE_CALL(double, i, j));
return 0;
}
这实现了两个功能:divide_double
和divide_int
。在更复杂(现实)的示例中,实现可以在单独的编译文件中,该文件针对具有不同DIVIDE_TYPE
定义的每种类型分别编译(或包含)。
与真正的泛型相比的缺点是不会自动生成不同类型的实现,即DIVIDE_CALL(mytype, x, y)
不会导致mytype
生成实现。(当然,这可以通过一些相对简单的脚本来安排,但是有人可能会争辩说您不再真正使用 C,并且有些语言具有更漂亮的内置泛型。=)
在任何情况下,这都适用于数据结构等需要实际数据类型(不是void *
指针)的地方。
您可以使用 void* 指针,然后进行大量转换。请注意,您需要以某种方式存储类型以重铸回原始元素,因此它并不完全是通用的,但与您所获得的一样接近。
显然这种代码很容易出错
像这样的东西: https ://github.com/10098/breakout/tree/master/dl_list/
这是我作为练习编写的双向链表的实现。我在一个简单的类似突围的游戏中使用它。