Linux的INIT_LIST_HEAD_FIRST,

时间:2014-10-07 02:40:07

标签: c linux-kernel

我找到了很多INIT_LIST_HEAD的引用,但我在INIT_LIST_HEAD_FIRST上找不到任何内容。两者之间的区别是什么。

INIT_LIST_HEAD(&orig_event->list);
INIT_LIST_HEAD_FIRST(orig_event->event_list);
INIT_LIST_HEAD_FIRST(orig_event->rt_hist_list);

指针指向的东西的一次传递和指针指向的另一次传递。

INIT_HLIST_HEAD(&bat_priv->gw.list);
    INIT_LIST_HEAD(&bat_priv->tt.changes_list);

INIT_LIST_HEADINIT_HLIST_HEAD之间有什么区别?

1 个答案:

答案 0 :(得分:1)

以下是每个宏的定义,来自list-batman.h

00062 #define INIT_LIST_HEAD(ptr) do { \
00063        (ptr)->next = (ptr); \
00064 } while (0)
00065 
00066 #define INIT_LIST_HEAD_FIRST(ptr) \
00067        ptr.next = (struct list_head *)&ptr; ptr.prev = (struct list_head *)&ptr; \
00068 

(第68行为空白,因此第67行的延续不执行任何操作。)

那么,这是什么意思?这个问题解释了奇特的do {。 。 。 } while (0)施工: Why use apparently meaningless do-while and if-else statements in macros? 因此,INIT_LIST_HEAD(ptr)意味着前进到下一个列表元素。

INIT_LIST_HEAD_FIRST(ptr)设置list_head结构的下一个和前一个指针,这是双链表的空状态。

我对这些宏的名称感到困惑,因为两者听起来像初始化,但这对于编写代码的开发人员来说是一个问题。

更多:

我最初忽略了有关INIT_HLIST_HEAD的问题。我查了一下,linux/list.h将其定义为:

 #define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)

它处理hlist_node结构,其中包含next指针和指针的pprev指针。宏初始化列表。