首页 > 解决方案 > C: sys/queue.h - 如何将指向 TAILQ_HEAD() 的指针传递给函数,而不是让 TAILQ_HEAD() 成为全局的?

问题描述

标签: cqueue

解决方案


我从不使用这个队列,但我发现的一种方法是在 q_item 本身中添加 TAILQ_HEAD() 。它有助于避免头部的全局使用。

#include <stdio.h>
#include <stdlib.h>
#include <sys/queue.h>

typedef struct q_item {
    int value;
    TAILQ_ENTRY(q_item) entries;
    TAILQ_HEAD(, q_item) head;
} q_item;

void enqueue(int n, q_item *q) {
    // enqueue the node with value n
    q_item *item;
    item = malloc(sizeof(q_item));
    item->value = n;
    printf("queued %d\n", item->value);
    TAILQ_INSERT_TAIL(&q->head, item, entries);
}

void dequeue(q_item *q) {
    q_item *returned_item;
    returned_item = TAILQ_FIRST(&q->head);
    printf("dequeued %d\n", returned_item->value);
    TAILQ_REMOVE(&q->head, returned_item, entries);
    free(returned_item);
}

int main() {

    q_item q;
    TAILQ_INIT(&q.head);

    enqueue(1, &q);
    enqueue(2, &q);
    enqueue(3, &q);

    dequeue(&q);
    dequeue(&q);

    return 0;
}

此外,查看此宏如何扩展可能很有用,只需使用gccusing-E选项进行编译,您将看到例如TAILQ_HEAD(, qitem) head扩展为

struct {
       struct q_item *tqh_first; 
       struct q_item **tqh_last; 
 } head;

您也可以在<sys/queue.h> 标题中找到它

/*
 * Tail queue definitions.
 */
#define TAILQ_HEAD(name, type)                                  \
struct name {                                                   \
    struct type *tqh_first; /* first element */                 \
    struct type **tqh_last; /* addr of last next element */     \
}

这就是为什么您的尝试void enqueue(int n, TAILQ_HEAD(, q_item) * head)不起作用的原因,因为预处理器进行了简单的替换。


推荐阅读