我正在阅读 linux/list.h
头文件,其中有一个 宏定义:
#define LIST_HEAD_INIT(name) { &(name), &(name) }
我想了解当我写入
LIST_HEAD_INIT(birthday_list)
时,宏会如何扩展?我正在阅读 linux/list.h
头文件,其中有一个 宏定义:
#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指针保留为空,它们被设定为指向头节点。
struct list_head birthday_list = {
.next = &birthday_list,
.prev = &birthday_list
}
LIST_HEAD_INIT(birthday_list)
展开为 { &(birthday_list), &(birthday_list) }
如果您想自己检查此或其他宏扩展的输出,可以直接查看预处理器的输出。GCC 有 -E 参数可用于执行此操作。
{ &(birthday_list), &(birthday_list) }
的含义是什么吗? - Milad Khajavix
,&x
求值为x
在内存中的位置。 - ApproachingDarknessFish