Я быстро взглянул на uv_walk
в источнике ...
void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg) {
QUEUE queue;
QUEUE* q;
uv_handle_t* h;
QUEUE_MOVE(&loop->handle_queue, &queue);
...
}
QUEUE
, QUEUE_MOVE
и т. Д., Как представляется, реализация очереди,в queue.h
, полностью определяется макросами.На IRC libuv кто-то предположил, что он может следовать BSD queue.h
, но выглядит он совсем по-другому (хотя, возможно, один вдохновил другой).
Я предполагаю, что это обычный подход C, либо для производительностипричины (избегая длинных цепочек обращений к небольшим функциям) или как тактический способ получения «общих» структур данных, не привязанных ни к какому типу.Я уверен, что в игре присутствует динамика «реального мира C», с которой я не знаком, и мне просто любопытно.
Спасибо!