我正在阅读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/

10-16 06:39
查看更多