伯克利在他们的freebsd中实现的queue.h确实非常有用,现在我有一个关于tailq_last宏的问题,请注意我给出的区别
原始代码

#define    TAILQ_HEAD(name, type)                        \
struct name
{                                \
    struct type *tqh_first;    /* first element */            \
    struct type **tqh_last;    /* addr of last next element */        \
}

#define    TAILQ_ENTRY(type)                        \
struct
{                                \
   struct type *tqe_next;    /* next element */            \
   struct type **tqe_prev;    /* address of previous next element */    \
}

#define    TAILQ_LAST(head, headname)                    \
(*(((struct headname *)((head)->tqh_last))->tqh_last))

我的建议
#define    TAILQ_LAST(head, headname)                    \
((head)->tqh_last))

我的观点是,headname的tqh_最后一个成员是指最后一个tailq_条目的tqe_下一个成员的地址,这正是tailq中最后一个条目的地址。
如果我错了,请纠正我。提前谢谢。

最佳答案

看看这两个定义,我想

#define    TAILQ_LAST(head, headname)                    \
(*(((struct headname *)((head)->tqh_last))->tqh_last))

将返回atype*
#define    TAILQ_LAST(head, headname)                    \
((head)->tqh_last))

将返回一个type**,因此两者不相等。

关于c - 我在Berkeley实现的queue.h中的修改正确吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13432131/

10-11 01:44