header 中的 typedef 结构和取消引用指向不完整类型的指针
typedef struct in header and dereference pointer to incomplete type
我对 C 很生疏,但我认为我在理解 headers 中使用 typedef
s 的正确用法时遇到问题,在实现文件中定义实际结构的结构,然后在第三个文件中使用该结构。
我写了一个 queue data-structure 类型定义如下:
typedef struct queue
{
int count;
qnode_t *head;
qnode_t *tail;
} queue_t;
其中 qnode_t
是仅在 queue 的实现文件中使用的结构。
在我的 header 我有这个:
typedef struct queue queue_t;
在另一个文件中使用此 queue_t
类型时,我试图像这样获取 queue 的长度:
queue_t *work_queue;
...
int length = work_queue->count;
但是,在我查找计数的那一行,我得到了编译器错误:
dereferencing pointer to incomplete type
我一直在研究如何在 C 中正确定义类型,但我认为我只是让自己越来越困惑,而不是变得清晰,因为许多示例要么与其他资源冲突,要么太过分了简化我投入实际使用。
我是否会收到此错误,因为结构中的 'count' 变量未在此处定义?如果是这种情况,那么我可以在实现和 header 中定义结构吗?如果是这样,header 是否可以只定义 count 变量,因为头部和尾部应该是 hidden/private? (我想念 OOP)我是否应该制作另一个函数,其长度为 queue_t*
和 returns 为 size_t
?
您只能解引用定义的类型,不能解引用声明的类型。
类型声明对 type-check 不透明指针很有用,但是
object 字段不可见,无法访问。您需要将 typedef 移动到 header
访问您的 queue object.
的字段
编辑:来自下面的questions/answers:
是的,两个相同的结构定义被视为相同的类型定义。如果您从未在同一个源文件中同时拥有这两个定义,则可以省略字段,但不要这样做,这会导致错误和维护混乱。最好使用命名约定,例如以下划线开头的名称是内部名称。
惯例是在 header 中定义结构,然后在实现文件中包含相同的 header。这使发布的布局与实现同步
除非编译器可以访问有关所指向对象类型的完整信息,否则在 C 中无法取消引用任何指针。对于结构指针,这意味着需要完整的结构定义。
因此,在编译抱怨类型不完整的代码时,编译器需要了解结构类型的完整定义,而不仅仅是指针的 typedef。
我对 C 很生疏,但我认为我在理解 headers 中使用 typedef
s 的正确用法时遇到问题,在实现文件中定义实际结构的结构,然后在第三个文件中使用该结构。
我写了一个 queue data-structure 类型定义如下:
typedef struct queue
{
int count;
qnode_t *head;
qnode_t *tail;
} queue_t;
其中 qnode_t
是仅在 queue 的实现文件中使用的结构。
在我的 header 我有这个:
typedef struct queue queue_t;
在另一个文件中使用此 queue_t
类型时,我试图像这样获取 queue 的长度:
queue_t *work_queue;
...
int length = work_queue->count;
但是,在我查找计数的那一行,我得到了编译器错误:
dereferencing pointer to incomplete type
我一直在研究如何在 C 中正确定义类型,但我认为我只是让自己越来越困惑,而不是变得清晰,因为许多示例要么与其他资源冲突,要么太过分了简化我投入实际使用。
我是否会收到此错误,因为结构中的 'count' 变量未在此处定义?如果是这种情况,那么我可以在实现和 header 中定义结构吗?如果是这样,header 是否可以只定义 count 变量,因为头部和尾部应该是 hidden/private? (我想念 OOP)我是否应该制作另一个函数,其长度为 queue_t*
和 returns 为 size_t
?
您只能解引用定义的类型,不能解引用声明的类型。 类型声明对 type-check 不透明指针很有用,但是 object 字段不可见,无法访问。您需要将 typedef 移动到 header 访问您的 queue object.
的字段编辑:来自下面的questions/answers:
是的,两个相同的结构定义被视为相同的类型定义。如果您从未在同一个源文件中同时拥有这两个定义,则可以省略字段,但不要这样做,这会导致错误和维护混乱。最好使用命名约定,例如以下划线开头的名称是内部名称。
惯例是在 header 中定义结构,然后在实现文件中包含相同的 header。这使发布的布局与实现同步
除非编译器可以访问有关所指向对象类型的完整信息,否则在 C 中无法取消引用任何指针。对于结构指针,这意味着需要完整的结构定义。
因此,在编译抱怨类型不完整的代码时,编译器需要了解结构类型的完整定义,而不仅仅是指针的 typedef。