我对 C 很生疏,但我认为我在理解在 header 中使用 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;
但是,在我查找计数的那一行,我得到了编译器错误:
dereferencing pointer to incomplete type
我一直在研究如何在 C 中正确定义类型,但我认为我只是让自己越来越困惑,而不是变得清晰,因为许多示例要么与其他资源冲突,要么过于简单我付诸实践。
我是否会收到此错误,因为结构中的“计数”变量未在此处定义?如果是这种情况,那么我可以在实现和 header 中定义结构吗?如果是这样,标题是否可以只定义计数变量,因为头部和尾部应该隐藏/私有(private)? (我想念 OOP)我是否应该制作另一个接受 queue_t*
并将其长度返回为 size_t
的函数?
最佳答案
您只能解引用已定义的类型,不能解引用已声明的类型。 类型声明对于类型检查不透明指针很有用,但是 对象字段不可见,无法访问。您需要将 typedef 移动到标题中 访问队列对象的字段。
编辑:来自以下问题/答案:
是的,两个相同的结构定义被视为相同的 typedef。如果您从未在同一个源文件中同时拥有这两个定义,则可以省略字段,但不要这样做,这会导致错误和维护困惑。最好使用命名约定,例如以下划线开头的名称是内部名称。
约定是在 header 中定义结构,然后在实现文件中包含相同的 header 。这使发布的布局与实现保持同步
关于c - header 中的 typedef 结构和取消引用指向不完整类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28377829/