标头中的typedef结构和解除引用指向不完整类型的指针

时间:2015-02-07 02:18:07

标签: c pointers struct typedef

我在C中相当生疏,但我认为我在理解在标题中使用typedef的正确用法时遇到了问题,在实现中定义了实际结构的结构文件,然后在第三个文件中使用结构。

我编写了一个队列数据结构,其类型定义如下:

typedef struct queue
{
    int count;
    qnode_t *head;
    qnode_t *tail;
} queue_t;

其中qnode_t是仅在队列的实现文件中使用的结构。

在我的标题中,我有这个:

typedef struct queue queue_t;

在另一个文件中使用此queue_t类型时,我试图获得这样的队列长度:

queue_t *work_queue;
...
int length = work_queue->count;

然而,在我查找计数的那一行,我得到编译器错误:

  

取消引用指向不完整类型的指针

我一直在做很多关于如何在C中正确定义类型的研究,但我认为我只是越来越混淆自己而不是清晰,因为许多例子要么与其他资源冲突,要么简化了我投入实际使用。

我是否会收到此错误,因为'计数'结构中的变量是不是在那里定义的?如果是这种情况,那么我可以在BOTH中实现和头部定义结构吗?如果是这样,标题只能具有自头部和头部以来定义的计数变量。尾巴应隐藏/私密? (我想念OOP)我应该制作另一个带queue_t*的函数并将其长度返回size_t吗?

2 个答案:

答案 0 :(得分:1)

您只能取消引用已定义的类型,而不是声明的类型。 类型声明对类型检查不透明指针很有用,但是 对象字段不可见,无法访问。您需要将typedef移动到标题中 访问队列对象的字段。

编辑:来自下面的问题/答案:

是的,两个相同的结构定义被视为相同的typedef。如果您从未在同一源文件中同时使用这两个定义,则可以省略字段,但不要这样做,这会导致错误和维护混乱。最好使用命名约定,例如以下划线开头的名称是内部的。

约定是在头文件中定义结构,然后在实现文件中包含相同的头。这使发布的布局与实现保持同步

答案 1 :(得分:0)

除非编译器能够访问有关所指向内容类型的完整信息,否则在C中无法取消引用任何指针。对于struct指针,这意味着需要完整的struct定义。

因此,在编译抱怨不完整类型的代码时,编译器需要能够看到结构类型的完整定义,而不仅仅是指针的typedef。