gpt4 book ai didi

带有函数指针的 C 通用 ADT

转载 作者:太空宇宙 更新时间:2023-11-04 02:10:50 25 4
gpt4 key购买 nike

我正在编写一个通用列表 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);

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

最佳答案

没有干净、完美的方法来解决这个问题。您有几个选择:

  • 在大多数平台上,您可以简单地在 void * 中填充一个整数。它很乱,但效果很好,特别是如果您使警告静音

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

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


编辑

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

#define box(value)                              \
({ \
typeof(value) *ptr = malloc(sizeof *ptr); \
*ptr = value; \
ptr; \
})

关于带有函数指针的 C 通用 ADT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14347247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com