我模糊地记得TAILQ_SPLICE()或梅里特门控源代码中的提供此类功能的函数。 Google搜索未找到任何此类参考。 BSD和Linux中的sys / queue.h似乎都没有这样的内容。
我有一个大清单和一个小清单。我想将小名单与大名单合并。
struct some_type {
int some_field;
TAILQ_ENTRY(some_type) list_next;
}
TAILQ_HEAD(,some_type) big_list;
TAILQ_HEAD(,some_type) small_list1;
TAILQ_SPLICE(&big_list, &small_list, list_next);
调用之后,small_list将为空,所有元素都将移至big_list。我想使用一些经过验证的代码(如果有),而不是自己编写。
最佳答案
根据我的测试,以下代码似乎有效。
#define TAILQ_SPLICE(head1, head2, headname, field) do { \
if (!TAILQ_EMPTY(head2)) { \
typeof((head1)->tqh_first) first2 = TAILQ_FIRST(head2); \
typeof((head1)->tqh_first) last2 = TAILQ_LAST(head2, headname); \
first2->field.tqe_prev = (head1)->tqh_last; \
if (TAILQ_EMPTY(head1)) { \
(head1)->tqh_first = first2; \
} else { \
*(head1)->tqh_last = first2; \
} \
(head1)->tqh_last = &last2->field.tqe_next; \
(head2)->tqh_first = NULL; \
(head2)->tqh_last = &((head2)->tqh_first); \
} \
} while (0);
关于c - 是否有用于合并两个TAILQ的sys/queue.h宏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32491120/