在C语言宏中,&符号有什么应用?

5

我正在阅读 linux/list.h 头文件,其中有一个 宏定义

#define LIST_HEAD_INIT(name) { &(name), &(name) }

我想了解当我写入LIST_HEAD_INIT(birthday_list)时,宏会如何扩展?
2个回答

8

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
}

1
没有什么特别的地方需要注意,它们只是另一个标记。 LIST_HEAD_INIT(birthday_list) 展开为 { &(birthday_list), &(birthday_list) } 如果您想自己检查此或其他宏扩展的输出,可以直接查看预处理器的输出。GCC 有 -E 参数可用于执行此操作。

你能解释一下 { &(birthday_list), &(birthday_list) } 的含义是什么吗? - Milad Khajavi
1
@Khajavi 这是取地址运算符。对于给定的变量 x&x 求值为 x 在内存中的位置。 - ApproachingDarknessFish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接