C语言定义含接收自身指针的函数指针的结构体报错,如何解决?
解决C语言结构体与函数指针typedef的循环依赖问题
这个问题其实是C语言里典型的类型声明循环依赖问题,不是写法完全错误,只是没处理好声明顺序。你遇到的报错本质是编译器处理代码时,还没见过被引用的类型就先用到了,下面给你两种靠谱的解决办法:
方法一:提前声明结构体标签(推荐)
先给结构体做一个不完整的类型声明,让编译器知道Test是一个结构体类型,再定义函数指针,最后补全结构体的完整定义:
// 提前声明结构体标签,告诉编译器"Test"是一个结构体类型(暂不定义内容) typedef struct Test Test; // 现在可以安全地用Test*定义函数指针类型了,编译器已经认识Test typedef void (*UserFunc)(Test *tx); // 补全结构体的完整定义,此时UserFunc已经存在 struct Test{ int a; char b; UserFunc func; };
方法二:结构体内部直接使用函数指针完整写法
如果不想提前声明结构体标签,也可以在结构体里直接写函数指针的完整类型,跳过提前typedef的步骤:
// 定义结构体时,直接用struct Test*作为函数参数类型 typedef struct Test{ int a; char b; void (*func)(struct Test *tx); } Test; // 如果之后需要复用这个函数指针类型,再补typedef也可以 typedef void (*UserFunc)(Test *tx);
为什么你的两种写法会报错?
- 第一种写法里,
typedef void (*UserFunc)(Test *tx);执行时,Test还没有被声明或定义,编译器完全不知道Test是什么类型,所以报unknown type name 'Test'。 - 第二种写法里,结构体内部使用
UserFunc时,这个类型的typedef声明在结构体后面,编译器还没见过UserFunc,自然报unknown type name 'UserFunc'。
内容的提问来源于stack exchange,提问作者Ruslan Yandiev
相关产品推荐
相关产品推荐

