伯克利在他们的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))
将返回a
type*
而#define TAILQ_LAST(head, headname) \
((head)->tqh_last))
将返回一个
type**
,因此两者不相等。关于c - 我在Berkeley实现的queue.h中的修改正确吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13432131/