不允许不完整的类型

时间:2014-04-22 18:12:07

标签: c struct incomplete-type

我试图通过将内存分配给指向队列的指针来创建队列,但是当我在大小槽中写入struct的名称时,我得到了这个错误。我真的不知道如何解释这个,所以代码:

结构,在queue.c中定义:

struct queue {
    Node front;
    Node back;
    int num;
    int (*e_func)(Elem,Elem);
};
typedef struct node* Node;
struct node {
    Elem e;
    Node next;
    Node prev;
};

queue.h:

#ifndef QUEUE_H
#define QUEUE_H
#include <malloc.h>
#include <stdlib.h>
typedef struct queue* Queue;
typedef void* Elem;
Queue CreateQ(int (*equals)(Elem,Elem));
void Enqueue(Queue Q, Elem e);
Elem Dequeue();
Elem front(Queue Q);
Elem back(Queue Q);
int size(Queue Q);
int isIn(Queue Q, Elem e);
#endif

在funcs.c中使用queue:

Queue Q = (Queue)malloc(sizeof(struct queue));

将鼠标放在struct参数中的sizeof()上时会显示错误。我到底做错了什么?我记得过去做过类似的事情并且有效。我相信它可能与节点中的void指针有关,但我该如何解决呢?

1 个答案:

答案 0 :(得分:1)

首先定义typedef'Node',以便它可用于下一个结构定义。 但是,现在在struct'node'中,'next'和'prev'元素不能是'Node'类型,因为它仅在完成typedef之后才被定义。然而,'struct node *'可用于定义'next'和'prev',因为'struct node'已被充分定义。

typedef struct node {
    Elem e;
    struct node *next;
    struct node *prev;
    } *Node;

稍后,你会发现你可以引用'next'和'prev',就好像它们被定义为'Node'类型一样;因为类型'Node'和类型'struct node *'(对编译器)是等价的。

struct queue {
    Node front;
    Node back;
    int num;
    int (*e_func)(Elem,Elem);
    };