Я просто получаю пустые указатели и двойные указатели в C и тому подобное, чтобы попытаться сделать вещи динамичными c. Затем я наткнулся на этот , который выглядит следующим образом:
typedef void *QUEUE[2];
#define QUEUE_NEXT(q) (*(QUEUE **) &((*(q))[0]))
#define QUEUE_PREV(q) (*(QUEUE **) &((*(q))[1]))
Слишком много указателей, паренов и ссылок происходит для моих глаз. Интересно, может ли кто-нибудь объяснить:
- что делает этот раздел
(*(QUEUE **) &((*(q))
, и - как эта очередь может содержать только два элемента.
Как Это работает? В частности, у них есть это:
#define QUEUE_INSERT_TAIL(h, q) \
do { \
QUEUE_NEXT(q) = (h); \
QUEUE_PREV(q) = QUEUE_PREV(h); \
QUEUE_PREV_NEXT(q) = (q); \
QUEUE_PREV(h) = (q); \
} \
while (0)
Как это работает QUEUE_INSERT_TAIL
?
Или, например, мне также было бы интересно узнать, что происходит с этим:
#define QUEUE_INIT(q) \
do { \
QUEUE_NEXT(q) = (q); \
QUEUE_PREV(q) = (q); \
} \
while (0)
...
QUEUE_INIT(&loop->wq);
QUEUE_INIT(&loop->idle_handles);
QUEUE_INIT(&loop->async_handles);
QUEUE_INIT(&loop->check_handles);
QUEUE_INIT(&loop->prepare_handles);
QUEUE_INIT(&loop->handle_queue);
В конце концов, они все используют QUEUE_NEXT
и QUEUE_PREV
внутри, совершая какие-то маги c.