我正在阅读 linux/list.h
header ,它有 this macro :
#define LIST_HEAD_INIT(name) { &(name), &(name) }
我想知道我在写LIST_HEAD_INIT(birthday_list)
时宏是如何展开的?
最佳答案
LIST_HEAD_INIT 用于初始化链表头结构实例。
#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
来自 linux/types.h:
struct list_head {
struct list_head *next, *prev;
};
扩展为
struct list_head name = { &(name), &(name) }
如您所见,它已扩展,现在结构实例“name”的“prev”和“next”指针字段指向自身。这就是列表头的初始化方式。
初始化后 LIST_HEAD(birthday_list) 是 birthday_list.prev = birthday_list.next = &birthday_list "birthday_list"是双链表的头节点,它是空的,而不是将 prev 和 next 指针保留为 NULL,它们已被设置为指向头节点。
struct list_head birthday_list = {
.next = &birthday_list,
.prev = &birthday_list
}
关于c - &符号在 C 宏中的应用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21059467/