【发布时间】:2020-04-11 12:10:33
【问题描述】:
我刚刚进入 C 中的 void 指针和双指针等尝试使事情动态化。然后我遇到了this,如下所示:
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,做了某种魔术。
【问题讨论】:
-
看看this example,应该会有所帮助。基本上,队列中的任何结构都必须包含一个
QUEUE元素,该元素用于将元素链接在一起形成一个循环的双向链。QUEUE_DATA宏用于从指向其QUEUE元素的指针访问原始结构。
标签: c arrays pointers queue libuv