我找到了很多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_HEAD
和INIT_HLIST_HEAD
之间有什么区别?
答案 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
指针。宏初始化列表。