c - C: sys/queue.h - 如何将指向 TAILQ_HEAD() 的指针传递给函数,而不是让 TAILQ_HEAD() 成为全局的?
问题描述
解决方案
我从不使用这个队列,但我发现的一种方法是在 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;
}
此外,查看此宏如何扩展可能很有用,只需使用gcc
using-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)
不起作用的原因,因为预处理器进行了简单的替换。
推荐阅读
- python - 尝试启动 Jupyter python 交互时 VSCode 抛出错误
- php - 使用 PHP 在 Google Drive API 中获取验证码的问题
- typescript - Type Guard 确保变量是 TypeScript 中的对象
- r - R中是否有任何函数可以在散点图的圆圈内给出标签?
- vb.net - 如何解决 UPDATE 语句中的语法错误
- javascript - 从两个父容器访问数据 - ReactJS
- python - 如何通过 sanic 获取主机名?
- magento2 - 将自定义字段添加到 Adminhtml 表单并填写数据(Magento 2)
- swift - 将这些组合成一个 var
- javascript - 读取 JSON 文件后出现写入问题 (discord.js)