[英]typedef struct leads to “pointer to incomplete type not allowed” error
[英]typedef struct in header and dereference pointer to incomplete type
我在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中正确定义类型的研究,但是我认为我一直在使自己越来越困惑,而不是变得清晰,因为许多示例要么与其他资源冲突,要么过于简化,以至于我无法发表。实际使用。
因为结构中的'count'变量未在其中定义,我会收到此错误吗? 如果是这样,那么我可以同时在实现和标头中定义结构吗? 如果是这样,由于标头和标头应隐藏/私有,标头只能定义计数变量吗? (我想念OOP)我应该只是做另一个函数,将一个queue_t*
并返回其长度为size_t
吗?
您只能取消引用已定义的类型,而不能取消声明的类型。 类型声明对于检查不透明指针的类型很有用,但是对象字段不可见,无法访问。 您需要将typedef移到标题中以访问队列对象的字段。
编辑:从以下问题/答案中进行:
是的,两个相同的结构定义被视为相同的typedef。 如果您从未在同一个源文件中同时拥有两个定义,则可以忽略字段,但不要这样做,这会导致错误和维护混乱。 最好使用命名约定,例如以下划线开头的名称是内部名称。
约定是在标头中定义结构,然后在实现文件中包含相同的标头。 这使发布的布局与实现保持同步
在C中不可能取消引用任何指针,除非编译器可以访问有关所指向类型的完整信息。 对于结构指针,这意味着需要完整的结构定义。
因此,在编译抱怨类型不完整的代码时,编译器需要具有结构类型的完整定义的可见性,而不仅仅是指针的typedef。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.