【发布时间】:2018-02-10 14:52:02
【问题描述】:
使用sys/queue.h的尾队列实现时,为什么下面的代码会起作用:
item_t *item = mkitem(...);
TAILQ_INSERT_HEAD(&list, item, entry);
以下应该是等价的,但不是:
TAILQ_INSERT_HEAD(&list, mkitem(...), entry);
最小的工作示例
#include <stdlib.h>
#include <stdio.h>
#include <sys/queue.h>
typedef struct item item_t;
typedef TAILQ_HEAD(list_head, item) list_head_t;
struct item {
int value;
TAILQ_ENTRY(item) entry;
};
static list_head_t items = TAILQ_HEAD_INITIALIZER(items);
static item_t* mkitem(int i) {
item_t *item = calloc(1, sizeof(item_t));
item->value = i;
return item;
}
static void print_tailq() {
item_t *it;
TAILQ_FOREACH(it, &items, entry) {
printf("%d,", it->value);
}
printf("\n");
}
int main() {
item_t *i1, *i2, *i3;
i1 = mkitem(1);
i2 = mkitem(2);
i3 = mkitem(3);
TAILQ_INSERT_HEAD(&items, i1, entry);
print_tailq();
TAILQ_INSERT_HEAD(&items, i2, entry);
print_tailq();
TAILQ_INSERT_TAIL(&items, i3, entry);
print_tailq();
/* However, this does not work: */
TAILQ_INSERT_HEAD(&items, mkitem(4), entry);
print_tailq();
TAILQ_INSERT_HEAD(&items, mkitem(5), entry);
print_tailq();
TAILQ_INSERT_TAIL(&items, mkitem(6), entry);
print_tailq();
return 0;
}
正如所料,print_tailq() 的前三个调用分别打印出来:
1,
2,1,
2,1,3,
但是,最后三个调用表明列表被TAILQ_INSERT_HEAD 截断,TAILQ_INSERT_TAIL 本质上是一个空操作。
4,
5,
5,
【问题讨论】:
-
是的,确实如此。我希望对
print_tailq的第四、第五和第六次调用的输出分别为4,2,1,3,、5,4,2,1,3,和5,4,2,1,3,6,。实际输出在问题中给出。 -
好的,我也试试。