2014-10-07 30 views
0

我發現很多INIT_LIST_HEAD的引用,但我在INIT_LIST_HEAD_FIRST上找不到任何東西。兩者之間有什麼區別。Linux的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

你在Linux內核中看到INIT_LIST_HEAD_FIRST的位置?我無法在[lxr](http://lxr.free-electrons.com/)中找到它。 – SSC 2014-10-07 05:37:20

回答

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指針的指針交易。宏初始化列表。