c - header 中的 typedef 结构和取消引用指向不完整类型的指针

标签 c pointers struct typedef

我对 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/

相关文章:

c - 零线程进程?

c - 我只能调用一个函数一次来使用指针比较两个数字

python - 有没有人有一个很好的例子来说明如何使用 struct python 模块将 numpy 数组保存到文件中?

clang 中的 C++ 结构内存开销?

c - 错误: incompatible types when initializing type 'struct ...'

python - 为什么在构建 python 模块时会出现此错误?

c - 转换是否会在整个系统中保持低位字节一致?

c - 如何对齐结构体的元素?

c++ - 如何合并两个包含 std::unique_ptr 的 vector ?

崩溃,不知道为什么