含自身结构体指针参数的函数指针的结构体定义及警告问题
解决结构体函数指针的类型不兼容警告
问题根源
你当前的两种写法中,struct thing 和 typedef 生成的 thing 并非同一类型,导致函数指针参数与实际函数的参数类型不匹配:
- 第一种写法里,
typedef struct thing thing_type声明了一个未定义的struct thing,但后续typedef struct { ... } thing是一个匿名结构体,和struct thing完全无关,函数指针参数thing_type*(即struct thing*)与bar1(thing *t)的thing*类型不兼容。 - 第二种写法里,匿名结构体被typedef成
thing,但函数指针参数写的是struct thing*——这个struct thing从未被定义,是一个全新的类型,自然和thing不匹配。
正确写法
以下两种方式都能彻底消除警告,同时保证类型一致性:
方式一:先typedef命名结构体,再定义结构体内容
// 头文件中 typedef struct thing thing; struct thing { int a; int b; double (*bar)(thing *t); };
方式二:先定义命名结构体,再typedef别名
// 头文件中 struct thing { int a; int b; double (*bar)(struct thing *t); }; typedef struct thing thing;
验证代码
使用上述任意一种写法后,初始化和赋值都不会触发警告:
double bar1(thing *t) { return t->a + t->b; } double bar2(thing *t) { return t->a * t->b; } int main() { thing foo = {1, 2, bar1}; // 无类型不兼容警告 foo.bar = bar2; // 无类型不兼容警告 return 0; }
补充说明
虽然你的原始代码功能正常(因为结构体内存布局一致),但编译器的类型检查是严格的——不同的结构体类型(哪怕布局相同)的指针属于不兼容类型,因此会触发警告。上述写法通过让struct thing和typedef的thing绑定为同一类型,从根源解决了类型不匹配问题。
内容的提问来源于stack exchange,提问作者M Tut
相关产品推荐
相关产品推荐

