1

我正在编写一个通用列表 adt,这就是我目前在标题中的内容。据我所知,这通常是如何完成的。

typedef struct _node {
    void *data;
    struct _node *next;
} Node;

typedef struct {
    Node *dummy;
    int (*comparePtr) (void *d1, void *d2);
    void (*destroyPtr) (void *data);
} List;

List *ListCreate (int (*comparePtr) (void *d1, void *d2), void (*destroyPtr) (void *data));
void ListDestroy (List *node);
void ListAddToTail (List *list, void *data);
int ListContains (List *list, void *data);
void *ListGetFromIndex (List *list, int index);

它在实施方面工作正常。我注意到的是,为了使用这个 adt 来存储整数,我必须以这种方式进行调用

int a = 5;
ListAddToTail (list, &a);

而在一个完美的世界里,我可以做到这一点

ListAddToTail (list, 55);

所以问题是是否可以修改它以允许我传入任何类型的数据,指针或非指针,非指针主要是原始类型,如整数和字符?

4

1 回答 1

3

没有干净,完全好的方法来解决这个问题。你有几个选择:

  • 在大多数平台上,您可以简单地将整数填充到void *. 它很乱,但效果很好,尤其是当您使警告静音时

  • 定义您自己的分配所需空间并返回指针的装箱函数/宏。您可能可以使用typeof技巧制作一个非常好的宏。但是你必须记住释放那个空间

主要问题应该是统一性。您的列表允许人们存储指针。您应该让他们处理诸如“我如何获得指向我的数据的指针”之类的问题。


编辑

我刚刚做了一个原始的“盒子”宏:

#define box(value)                              \
({                                              \
    typeof(value) *ptr = malloc(sizeof *ptr);   \
    *ptr = value;                               \
    ptr;                                        \
})
于 2013-01-15T21:32:45.733 回答