【问题标题】:The use of structs in the queue.h libraryqueue.h 库中结构体的使用
【发布时间】:2019-01-11 04:18:06
【问题描述】:

我目前正在研究 C 语言中宏的使用。 为了习惯它们并学习,我正在查看允许在 C 中创建动态数据结构的 queue.h 库。

您可以在这里找到来源: bxr.su/OpenBSD/sys/sys/queue.h

现在我偶然发现了以下定义:

#define SLIST_ENTRY(type) \
    struct { \
    struct type *slh_next;
    }

如果我没记错的话,这会创建一个带有指针的结构,该指针将指向单链表中的下一个元素。 我只是想不通,为什么你必须创建结构。难道只有指针就够了吗?

#define SLIST_ENTRY(type) \
    struct type *slh_next 

我想如果你想创建一个双向链表,你会创建一个带有 next & before 指针的结构。那么这只是为了保持一致,还是 SLIST 定义中的结构用于特定目的?

PS:如何在手机上格式化代码和链接?

【问题讨论】:

  • 如果你能用简单的方式写,你为什么要写这么模糊的代码?
  • 头文件不是一个库,它可能描述一个库的接口。在您的情况下,BSD 通常在 sys 树中具有 内核 源,因此它很可能不是您正在查看的库接口。
  • 对于实际用例,这样做是为了以通用方式处理链接,但现在,我也没有看到包装匿名结构的必要性。

标签: c macros queue


【解决方案1】:

当您在单链表中使用它时可能没有多大意义,但如果您在source code 中看到(双链)列表的定义,那么它的目的就更清楚了,因为现在它有两个指针并且您只需将一个 LIST_ENTRY 结构添加到您的数据结构中。

#define LIST_ENTRY(type)                                             \
struct {                                                             \
    struct type *le_next;   /* next element */                       \
    struct type **le_prev;  /* address of previous next element */   \
}

LIST_ENTRY(type) 扩展为匿名struct。在 C11 标准中引入了匿名 structs 和匿名 unions。当匿名struct 或匿名union 包含在另一个structunion 中时,封闭结构获取封闭匿名结构的字段。

看看这个questionexample code

struct entry { 
    ... 
    LIST_ENTRY(entry) entries; 
    ... 
} *n1, *n2, *np;

在这种情况下,LIST_ENTRY(entry) 的字段变为entry 的字段。所以,是的,就像上面有人说的那样,它是一种通用类型的链接。现在一个函数可以从这个结构中获取上一个和下一个元素,如下所示:

#define LIST_INSERT_AFTER(listelm, elm, field) do {                 \
    if (((elm)->field.le_next = (listelm)->field.le_next) != NULL)  \
        (listelm)->field.le_next->field.le_prev =                   \
            &(elm)->field.le_next;                                  \
    (listelm)->field.le_next = (elm);                               \
    (elm)->field.le_prev = &(listelm)->field.le_next;               \
} while (0)

【讨论】:

    猜你喜欢
    • 2014-04-14
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多