Berkeley が 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_lastメンバーが最後のTAILQ_ENTRYのtqe_nextメンバーのアドレスを参照しているということです。これは正確に tailq の最後のエントリのアドレスです。
私が間違っている場合は修正してください。前もって感謝します。