5

我试图围绕使用宏来定义数据结构操作的概念。以下代码是使用 FreeBSD 中内置列表库的简单示例。在库中,所有操作都定义为宏。我也在其他几个库中看到了这种方法。

我可以看到这有一些优点,例如。能够使用任何数据结构作为列表中的元素。但我不太明白这是如何工作的。例如:

  1. 是什么stailhead?这似乎是“刚刚”定义的。
  2. 如何传递head和传递entries给函数?
  3. 什么类型head,如何声明指向它的指针?

这种技术是否有一个标准名称可以用来搜索谷歌,或者任何解释这个概念的书?任何有关此技术如何工作的链接或良好解释将不胜感激。

感谢Niklas B。我运行gcc -E并得到了这个定义head

struct stailhead {
  struct stailq_entry *stqh_first;
  struct stailq_entry **stqh_last; 
} head = { ((void *)0), &(head).stqh_first };

这对于stailq_entry

struct stailq_entry {
 int value;
 struct { struct stailq_entry *stqe_next; } entries;
};

所以我猜head是 type struct stailhead

#include <stdio.h>
#include <stdlib.h>
#include <sys/queue.h>

struct stailq_entry {
        int value;
        STAILQ_ENTRY(stailq_entry) entries;
};

int main(void)
{
        STAILQ_HEAD(stailhead, stailq_entry) head = STAILQ_HEAD_INITIALIZER(head);
        struct stailq_entry *n1;
        unsigned i;
        STAILQ_INIT(&head);                     /* Initialize the queue. */

        for (i=0;i<10;i++){
                n1 = malloc(sizeof(struct stailq_entry));   /* Insert at the head. */
                n1->value = i;
                STAILQ_INSERT_HEAD(&head, n1, entries);
        }
        n1 = NULL;

        while (!STAILQ_EMPTY(&head)) {
                n1 = STAILQ_LAST(&head, stailq_entry, entries);
                STAILQ_REMOVE(&head, n1, stailq_entry, entries);
                printf ("n2: %d\n", n1->value);
                free(n1);
        }

        return (0);
}
4

1 回答 1

7

首先阅读本文以了解这些宏的作用。然后去queue.h。你会在那里得到你的宝库!

我给你找了几枚金币——

#define STAILQ_HEAD(name, type)                                         \
struct name {                                                           \
        struct type *stqh_first;/* first element */                     \
        struct type **stqh_last;/* addr of last next element */         \
}

让我们深入挖掘并回答您的问题

什么是尾灯?这似乎是“刚刚”定义的。

#define STAILQ_HEAD(name, type)                                         \
struct name {                                                           \
        struct type *stqh_first;/* first element */                     \
        struct type **stqh_last;/* addr of last next element */         \
}
 STAILQ_HEAD(stailhead, entry) head =
 STAILQ_HEAD_INITIALIZER(head);
 struct stailhead *headp;            /* Singly-linked tail queue head. */

stailhead结构也是如此

如何将头部和条目传递给函数?

#define STAILQ_ENTRY(type)                                              \
struct {                                                                \
        struct type *stqe_next; /* next element */                      \
}

所以entriesand head(如前所述)只是结构,你可以像传递其他结构一样传递它们。&structure_variable

head 是什么类型,如何声明指向它的指针?

已经解释过了!

阅读此手册页以获取漂亮的示例。

于 2012-04-05T15:43:47.143 回答