我正在阅读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) }
如您所见,它已展开,现在结构实例“名称”的“上一个”和“下一个”指针字段指向其自身。这就是初始化列表头的方式。
初始化后,LIST_HEAD(birthday_list)为
Birthday_list.prev = Birthday_list.next =&birthday_list
“birthday_list”是双链接列表的头节点,该头为空,并且已将上一个和下一个指针保留为NULL,而已将它们设置为指向头节点。
struct list_head birthday_list = {
.next = &birthday_list,
.prev = &birthday_list
}
关于c - 在C宏中“&”号有什么用途?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21059467/