本文主要是介绍typedef定义结构体包含函数指针的巨坑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
起因
尝试在c中模仿c++的类,把成员函数放置到结构体中。显然只能放置一个结构体指针。
于是准备这么做。
错误示范
typedef struct {int id;void(*show)(Person p);
}Person;void showPerson(Person p){
//....
}void init(Person * p){p->show = showPerson;
}
运行结果:
错误 C2224 “.show ”的左侧必须具有结构/联合类型
以及一大堆乱七八糟的语法错误
错误原因
如果你这个结构体是使用 typedef + 无名结构体定义的,然后结构体内部又用到了自身这个结构体的类型,并且你直接使用 定义的别名作为类型,就会报错。
上面代码中:
void(*show)(Person p);
这里的 Person 实际是typedef定义出来的别名。
但是目前是在结构体内部使用,还没有解析到typedef,显然别名此时不生效了
解决办法
typedef 定义时,不要定义无名结构体,而是起个名字,名字和别名一样
然后内部使用这个结构体类型时,使用 struct 结构体名
示例:
typedef struct Person {int id;void(*show)(struct Person p);
}Person;
这样就没问题了
这篇关于typedef定义结构体包含函数指针的巨坑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!