我正在构建一个依赖队列的小文件实用程序,我在编译时遇到错误:
error: request for member "entries" in something not a structure or union
我把它剥离到了队列处理线,我得到了同样的错误,这里是标题的来源:
#ifndef _tailq_test_h
#define _tailq_test_h
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/queue.h>
struct tail_q {
TAILQ_ENTRY(tail_q) entries;
int item;
};
TAILQ_HEAD(tail_queue, tail_q);
static struct tail_queue queue;
int main();
#endif
对于该计划:
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/queue.h>
#include "tailq-test.h"
static struct tail_queue queue;
int main()
{
struct tail_q *q_ptr;
int data = 1;
TAILQ_INIT(&queue);
TAILQ_INSERT_HEAD(&queue, &data, entries);
return 0;
}
回溯指的是行TAILQ_INSERT_HEAD(&queue, &data, entries);
,如果使用TAILQ_INSERT_TAIL
,则效果相同。
我不确定它为什么不编译。我检查了this question的答案,提供的示例编译得很好。我无法发现差异/我做错了什么。
非常感谢任何帮助。
答案 0 :(得分:1)
我对TAILQ不太熟悉,所以我看了一下你可以在这里找到的源代码:http://www.gnu.org/software/mifluz/doc/doxydoc/queue_8h-source.html
以下是TAILQ_INSERT_HEAD
的源代码:
#define TAILQ_INSERT_HEAD(head, elm, field) do {
if (((elm)->field.tqe_next = (head)->tqh_first) != NULL)
(head)->tqh_first->field.tqe_prev =
&(elm)->field.tqe_next;
如您所见,第二个参数elm
必须是包含第三个参数作为成员(field
)的结构。
在您的情况下,您的第二个参数是int *
,它没有您的错误消息所指出的entries
成员。
根据我的理解,您必须将tail_q
结构作为代码的第二个参数进行编译。
编辑: 例如,以下代码编译:
int main()
{
struct tail_q q;
int data = 1;
q.item = data; // Include your data in your struct.
TAILQ_INIT(&queue);
TAILQ_INSERT_HEAD(&queue, &q, entries); // Notice that I am passing a tail_q pointer here.
return 0;
}