gpt4 book ai didi

c - "overlapping"功能的良好库设计

转载 作者:行者123 更新时间:2023-11-30 14:29:26 27 4
gpt4 key购买 nike

我正在尝试创建一个库,它提供一个简单的链表实现以及该链表的一些概括,例如堆栈和队列,所有这些都基于基本链表。

问题是,我希望拥有具有自己的“私有(private)”函数的不同类型,这样您就不会使用“stack_pull(my_queue);”或“queue_pull(my_stack)”,这将导致该特定类型的列表出现错误行为。我现在能想象它如何工作的唯一方法是将基本链表结构包装在其他结构中以用于它们自己的类型,基本上像这样

typedef struct node
{
void *data;
list_node *next;
} list_node

typedef struct list
{
list_node *root;
} linked_list;

typedef struct queue
{
linked_list *base;
} queue;

typedef struct stack
{
linked_list *base;
} stack;

linked_list *list_create();
void list_dispose(linked_list **, void (*free_content)(void *));

queue *queue_create();
void queue_dispose(queue **, void (*free_content)(void *));

stack *stack_create()
void stack_dispose(stack **, void (*free_content)(void *));

这样,我就必须编写专门的函数来利用基本函数和常量展开来获取实际数据,例如

queue *queue_create()
{
[...] /* Allocate a new queue struct */
tmp_queue->base = list_create();
[...]
return tmp_queue
}

void *stack_pull(stack *s)
{
[...] /* Error checking */
return list_pop_last(s->base);
}

void *queue_pull(queue *q)
{
[...] /* Error checking */
return list_pop_first(s->base);
}

如果我想从基本列表中进行特化,这是我必须忍受的开销吗?或者有没有一种漂亮而干净的方法?

最佳答案

将列表结构包装在另一个结构中是处理此问题的好方法。不应该有任何额外的运行时开销或内存使用,因为内部结构和外部结构的对齐和填充要求应该完全相同(因为外部结构的对齐和填充仅来自内部结构)。

就适用于它们的函数/方法而言,您可以使用内联来消除在堆栈或队列函数只是简单重命名(或特殊调用)或列表函数。

inline void queue_dispose(queue **Q, void (*free_content)(void *)) {
list_dispose(&&(*Q->base), free_content);
}

这将确保您获得相同级别的类型检查,但没有运行时开销或额外代码。除非您使用指向这些函数的指针,否则您不应该遇到问题,如果是的话,您也可以包含它们的常规实现。

您应该注意到,将节点指针作为唯一成员放入列表结构中已经与将列表包装在堆栈或队列结构中相同的应用程序。

关于c - "overlapping"功能的良好库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4606297/

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