我在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
吗?
答案 0 :(得分:1)
您只能取消引用已定义的类型,而不是声明的类型。 类型声明对类型检查不透明指针很有用,但是 对象字段不可见,无法访问。您需要将typedef移动到标题中 访问队列对象的字段。
编辑:来自下面的问题/答案:
是的,两个相同的结构定义被视为相同的typedef。如果您从未在同一源文件中同时使用这两个定义,则可以省略字段,但不要这样做,这会导致错误和维护混乱。最好使用命名约定,例如以下划线开头的名称是内部的。
约定是在头文件中定义结构,然后在实现文件中包含相同的头。这使发布的布局与实现保持同步
答案 1 :(得分:0)
除非编译器能够访问有关所指向内容类型的完整信息,否则在C中无法取消引用任何指针。对于struct指针,这意味着需要完整的struct定义。
因此,在编译抱怨不完整类型的代码时,编译器需要能够看到结构类型的完整定义,而不仅仅是指针的typedef。