#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
list->prev = list;
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
list->prev = list;
}
When it is expended,
LIST_HEAD(name) comes to be
struct list_head name = {&(name), &(name)}
and since
struct list_head {
struct list_head *next, *prev;
}
combine these two, we can symetrically get the means
(the same as we manually declare a global variable named *name*,
and call INIT_LIST_HEAD)
{
struct list_head name;
name.prev = &name;
name.next = &name;
}
Obviously, the use of macros is simple and elegant.
本文探讨了Linux内核中LIST_HEAD宏的使用,如何通过LIST_HEAD(name)创建一个自引用的链表头,以及其与INIT_LIST_HEAD函数的等价性。宏观的简洁性和优雅性使得在内核代码中管理链表变得更为方便。

1349

被折叠的 条评论
为什么被折叠?



