【发布时间】:2018-07-07 08:49:46
【问题描述】:
谁能解释一下 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);
调用队列中的最后一个节点并被当前节点覆盖? 最后一个节点会是什么?
【问题讨论】:
标签: c linux linux-kernel macros queue