sys / queue.h错误:请求非结构或联合的成员(TAILQ)

时间:2015-09-26 02:23:38

标签: c queue

我正在构建一个依赖队列的小文件实用程序,我在编译时遇到错误:

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的答案,提供的示例编译得很好。我无法发现差异/我做错了什么。

非常感谢任何帮助。

1 个答案:

答案 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;
}