kernel:list LIST_HEAD/LIST_HEAD_INIT/INIT_LIST_HEAD
#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;
}
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;
}
补充:综合编程 , 其他综合 ,