gpt4 book ai didi

c - 在 C 中使用宏定义数据结构

转载 作者:太空狗 更新时间:2023-10-29 14:59:34 25 4
gpt4 key购买 nike

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

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

  1. 什么是stailhead?这似乎是“刚刚”定义的。
  2. 如何将 headentries 传递给函数?
  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;
};

所以我猜 headstruct 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);
}

最佳答案

先读 this了解这些宏的作用。然后转到 queue.h。你会在那里找到你的宝库!

我给你找了几个金币-

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

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

What is stailhead? This seems to be "just" defined.

#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是一个结构

How to pass head and entries to a function?

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

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

What type is head, how can I declare a pointer to it?

已经解释过了!

阅读this man page漂亮漂亮的例子。

关于c - 在 C 中使用宏定义数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10031665/

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