我正在查看两个链表实现(queue.h [ source ] 和utlist.h [ source ]),我对它们各自的实现有一些疑问:
_Q_INVALIDATEqueue.h中的全部内容是什么?我想这是一些调试的一部分,但我不太了解宏观define逻辑。- 两种实现都提供
FOREACH和FOREACH_SAFE. 前者是直截了当的,但第二个背后的逻辑是什么?另外,如果前者无论如何都不安全,那为什么要首先实施呢? - 为什么将
queue.h其结构实现为具有不同类型的nextandprev(struct *le_nextandstruct **le_prev)? - 在这两种实现中,为什么要在这里和那里插入额外的括号?例如。
head在附近#define LIST_FIRST(head) ((head)->lh_first)