C中的通用实现

时间:2010-11-20 12:02:57

标签: c generic-programming

Hii,

虽然我正在为类分配实现一些程序,但它让我感到震惊的是如何使用C以通用方式实现它。

我知道我们需要使用void指针和函数,但我只是坚持如何做到这一点。请给我一个简单的例子并说明其用法。

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

P.S:任何其他问题或文章的链接都是有帮助和欢迎的。

3 个答案:

答案 0 :(得分:2)

你可以使用void *指针,然后进行大量的转换。请注意,您需要以某种方式存储类型以重新返回到原始元素,因此它不是完全通用的,而是尽可能接近您。

显然,这类代码非常容易出错

答案 1 :(得分:2)

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

#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 *指针)。

答案 2 :(得分:0)

这样的事情: https://github.com/10098/breakout/tree/master/dl_list/

这是我作为练习写的双重链表的实现。我在一个类似突破的游戏中使用它。