typedef void *QUEUE[2];
定義一個新類型QUEUE, 類型爲void* [2], 相似於雙向鏈表
對於普通數據節點, QUEUE[0]
爲下一個節點的指針, QUEUE[1]
爲上一個節點的指針;
對於Head節點(至關於索引), QUEUE[0]
第1個節點的指針, QUEUE[1]
爲最後1個節點的指針指針
#define QUEUE_NEXT(q) ( *(QUEUE **) &( (*(q))[0] ) )
q是指向QUEUE的指針, 實際類型爲 void *( *)[2]
,
(*(q))
類型爲void* [2]
(*(q))[0]
類型爲 void*
, 爲下一個節點的指針
(QUEUE **) &( (*(q))[0] )
這麼寫是爲了讓這個宏能夠同時兼容賦值操做和取值操做, 好比code
( *(QUEUE **) &( (*(q))[0] ) ) = NULL; //這是一個賦值操做, 給第1個元素賦值 void* x = ( *(QUEUE **) &( (*(q))[0] ) ); //這是一個取值操做, 取出第1個元素
#define QUEUE_DATA(ptr, type, field) \ ((type *) ((char *) (ptr) - offsetof(type, field)))
通常隊列外面還會再包一層結構層, QUEUE_DATA
用於獲得這個結構體指針;blog
#define QUEUE_INSERT_HEAD(h, q) \ do { \ //q的下一個節點爲原來的第1個數據節點 QUEUE_NEXT(q) = QUEUE_NEXT(h); \ //q的上一個節點就是h QUEUE_PREV(q) = (h); \ //原來的第1個數據節點的上一節點爲q QUEUE_NEXT_PREV(q) = (q); \ //Head節點的下一個節點爲q QUEUE_NEXT(h) = (q); \ } \ while (0)