TAILQ_INSERT_TAIL宏<sys queue.h =“”>

时间:2018-01-28 15:35:05

标签: c macros queue

有人可以解释TAILQ_INSERT_TAIL宏的最后两行:

#define TAILQ_INSERT_TAIL(head, elm, field) do {     
    (elm)->field.tqe_next = NULL;               /
    (elm)->field.tqe_prev = (head)->tqh_last;   /
    *(head)->tqh_last = (elm);                  /    
    (head)->tqh_last = &(elm)->field.tqe_next;  /   
} while (/*CONSTCOND*/0)

据我所知,通常,在队列尾部插入一些节点我们需要做4件事: 1)在节点空指针指向下一个节点。 (第一行宏) 2)在队列的最后一个元素中添加指向节点的指针(宏的第二行) 3)在节点链接指向前一个节点的队列中的最后一个元素。 4)队列头结构指针更新指向队列中最后一个元素到节点的最后一个元素。

1和2分我在宏观中清楚地理解,但3和4有一些误解,特别是,我无法理解代码如下:

*(head)->tqh_last = (elm);

调用队列中的最后一个节点并用当前节点覆盖它? 最后一个节点会是什么?

1 个答案:

答案 0 :(得分:0)

(head)->tqh_last是指向另一个指针的指针,请参见此处,最后一行:

(head)->tqh_last = &(elm)->field.tqe_next;

所以,如果我们交换最后两行,你可以理解它

(head)->tqh_last = &(elm)->field.tqe_next;
*(head)->tqh_last = (elm);

修改

参考<sys/queue.h>

/*
 * Tail queue definitions.
 */
#define _TAILQ_HEAD(name, type, qual)                                   \
struct name {                                                           \
    qual type *tqh_first;           /* first element */                 \
    qual type *qual *tqh_last;      /* addr of last next element */     \
}
#define TAILQ_HEAD(name, type)  _TAILQ_HEAD(name, struct type,)

#define TAILQ_HEAD_INITIALIZER(head)                                    \
        { NULL, &(head).tqh_first }
  1. qual type *qual *tqh_last;它有两颗星
  2. #define TAILQ_HEAD_INITIALIZER(head) { NULL, &(head).tqh_first },它将thq_last设置为tqh_first的地址,这是一个指针,所以tqh_last是一个指向指针的指针
  3. 参考

    请参阅Linus answer的类似问题(很多,只需搜索在页面的另一端