如何创建一个通用的C自由函数

时间:2010-03-31 11:54:21

标签: c generics

我有一些与'list'数据结构相关的C结构。 它们看起来像这样。

struct nmlist_element_s {
    void *data;
    struct nmlist_element_s *next;
};
typedef struct nmlist_element_s nmlist_element;

struct nmlist_s {
    void (*destructor)(void *data);
    int (*cmp)(const void *e1, const void *e2);
    unsigned int size;
    nmlist_element *head;
    nmlist_element *tail;
};
typedef struct nmlist_s nmlist;

这样我可以在“nmlist_element-> data”中保存不同的数据类型。 “构造函数”(以OOP表示)具有以下签名:

nmlist *nmlist_alloc(void (*destructor)(void *data));

其中“析构函数”是取消分配“数据”的特定函数(由nmlist_element保存)。

如果我想要一个包含整数作为数据的列表,我的“析构函数”会这样:

void int_destructor(void *data)
{
    free((int*)data);
}

我仍觉得为每个简单的原始数据类型编写析构函数对我来说“不友好”。 那么写这样的东西有诀窍吗? (对于原语)

void "x"_destructor(void *data, "x")
{
    free(("x" *)data);
}
PS:我自己并不是一个宏观迷,在我对C的短暂体验中,除非必要,否则我不会使用它们。

3 个答案:

答案 0 :(得分:12)

C free()函数已经是通用的。只需使用免费(数据)。

答案 1 :(得分:4)

您不需要将其强制转换为int *来释放它。你可以直接释放虚空*。

如果你真的想用宏来做(或者为了将来的参考,如果你真的有一个非通用的函数,不像free()),最好的方法是使用X宏。

#define TYPES_TO_DESTRUCT \
 X(int) \
 X(char) \
 X(t_mytype)

#define X(type) \
void type##_destructor(void *data) { free((type *)data); }

TYPES_TO_DESTRUCT

#undef X

答案 2 :(得分:0)

我认为Kosta是对的。但是你要求像

这样的东西

#define DESTROY(x,data) (free((x##*)data))