【发布时间】:2018-05-27 12:43:13
【问题描述】:
我正在为链表和树编写一个 c 库,我正在寻找一种解决方案来概括这些库处理的数据类型,而不需要为我需要处理的每种类型创建一个列表/树库。
例如,我的列表库有这些功能:
/* list.h */
typedef int list_element; // <-- need to generalize that
struct list_node {
list_element value;
struct list_node* next;
};
typedef struct list_node list_node;
typedef struct list_node* list;
extern list list_cons(list_element d, list l)
然后是我的 list.c:
/* list.c */
#include <list.h>
list list_cons(list_element d, list l){
list m = malloc(sizeof(list_node));
m->value = element_copy(d);
m->next = l;
return m;
}
现在假设在我的主程序中我必须使用一个 int 列表和一个 double 列表,我应该创建 2 对文件,例如 list_float.c/.h 和 list_int.c/.h
还有一些 list_element 可以是结构体,需要像 copy/isLess/isEqual 这样的函数来比较自己
我想在我的代码中写这样的东西:
/* main.c */
list_cons(void *data, list l);
data 是指向我想要的任何类型的指针,在 list_cons 内部,element_copy 适用于我传递的任何类型的数据(显然我需要复制数据而不是指向数据的指针,void* 是唯一的想法是我必须概括函数的参数类型)
【问题讨论】:
-
基本上你想先 typedef int list_element 然后 typedef float list_element?不,你不能这样做。
-
你可以这样做,但你不能在一个程序中使用它
-
@purec 我知道我不能,这就是问题所在。如果我主要使用不同类型的不同列表,我必须为每种类型创建一个库,并为每个函数使用不同的名称,这太痛苦了。我一直在寻找避免这种情况的解决方案
-
您可以尝试使用可以轻松进行类型转换的指针,而不是 int、float 类型。例如 void* 数据
-
如果您使用 C++,这可以通过模板轻松完成。
标签: c