8

嗨,

当我为课堂作业实现一些程序时,我突然想到使用 C 以通用方式实现相同的程序。

我确实知道我们需要使用 void 指针和函数,但我只是不知道该怎么做。请给我一个简单的例子并演示用法。

比如如何实现一个比较函数来实现一个比较排序,或者插入一个链表,其中每个节点都有一个不同类型的元素等......

PS:任何指向其他问题或文章的链接都是有帮助和欢迎的。

4

3 回答 3

3

好吧,显然一种参数化类型的方法是使用预处理器,例如:

#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_doubledivide_int。在更复杂(现实)的示例中,实现可以在单独的编译文件中,该文件针对具有不同DIVIDE_TYPE定义的每种类型分别编译(或包含)。

与真正的泛型相比的缺点是不会自动生成不同类型的实现,即DIVIDE_CALL(mytype, x, y)不会导致mytype生成实现。(当然,这可以通过一些相对简单的脚本来安排,但是有人可能会争辩说您不再真正使用 C,并且有些语言具有更漂亮的内置泛型。=)

在任何情况下,这都适用于数据结构等需要实际数据类型(不是void *指针)的地方。

于 2010-11-20T12:42:24.347 回答
2

您可以使用 void* 指针,然后进行大量转换。请注意,您需要以某种方式存储类型以重铸回原始元素,因此它并不完全是通用的,但与您所获得的一样接近。

显然这种代码容易出错

于 2010-11-20T12:30:42.203 回答
0

像这样的东西: https ://github.com/10098/breakout/tree/master/dl_list/

这是我作为练习编写的双向链表的实现。我在一个简单的类似突围的游戏中使用它。

于 2010-11-20T13:23:37.743 回答