C语言使用typedef定义自引用结构体出现未知类型错误如何解决
问题根因
你写的代码中,foo_t 是给匿名结构体定义的别名,在结构体内部声明 foo_t *bar 时,foo_t 的别名定义还未完成,编译器无法识别该类型,因此抛出未定义类型错误。
正确解决方案
有两种符合C标准的规范写法可以解决这个问题,全程不需要使用void*做强制类型转换,完全保留类型检查能力:
方案1:提前声明结构体别名
先对结构体类型做前置声明,再完成结构体的完整定义:
// 前置声明:告诉编译器 foo_t 是一种结构体类型 typedef struct foo_tag foo_t; // 完整定义结构体 struct foo_tag { foo_t *bar; // 此时foo_t已经被提前声明,编译器可以正常识别 };
方案2:在结构体内部使用结构体标签引用
给结构体添加显式标签,内部声明成员时直接使用结构体标签即可,结构体标签在struct 标签名出现时就已经生效,不需要等待typedef完成:
typedef struct foo_tag { struct foo_tag *bar; // 直接使用已生效的结构体标签声明指针 } foo_t; // 最后完成别名定义,不影响内部成员的声明
补充说明
两种写法均完全符合C语言标准,不存在兼容性问题,是实现自引用结构体的通用标准实践。
内容的提问来源于stack exchange,提问作者KJ7LNW
相关产品推荐
相关产品推荐

