c - &符号在 C 宏中的应用是什么?

标签 c macros linux-kernel linked-list

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

相关文章:

c - 如何使用 libnl 将我的设备连接到 wifi?

c++ - 右移开头为零

c - __func__ 标识符如何构成安全风险?

sockets - 为什么 skb_buffer 需要跳过 20 个字节才能在数据包输入时读取传输缓冲区?

linux - 新的嵌入式项目;哪个 ARM CPU 对 Linux 的支持最好?

c - 关于C语言中的内存

c++ - 如何根据预处理器定义的宏关闭 C++ 库的子模块

macros - 使用 clojure 宏在 reify 调用中自动创建 getter 和 setter

linux - 如何修改linux内核中的kvm模块?

c++ - 用gdb调试的时候,汇编代码前面的调试信息是什么意思?