C语言给结构体函数指针成员赋值报incompatible-pointer-types错误如何解决
问题根因
你遇到的编译错误是函数指针类型和实际函数的返回值类型不匹配导致的:
你定义的函数指针类型 tone_function_t 标注的返回值是 bool,但实际要赋值的 tone 函数返回值为 bool_t,两个类型不完全一致,因此编译器判定为指针类型不兼容。
解决方法
方案1(推荐):统一返回值类型
直接修改函数指针的typedef定义,将返回值和实际函数对齐即可:
// 原定义返回值为bool,和实际函数返回值bool_t不匹配 // typedef bool (*tone_function_t) (state_t *state, u8_t type); // 修改后返回值和实际函数一致 typedef bool_t (*tone_function_t) (state_t *state, u8_t type);
修改后赋值语句node.tone = &tone;即可正常编译,此处&符号可省略,函数名本身就会隐式转换为函数地址。
方案2(不推荐):强制类型转换
如果你已经确认bool和bool_t的底层存储、长度完全一致,也可以通过强制类型转换绕过编译器检查:
node.tone = (tone_function_t)&tone;
该方案会掩盖真实的类型差异,可能引发后续函数调用时的返回值解析错误、栈不平衡等运行时问题,非特殊情况不要使用。
同类问题排查思路
后续遇到incompatible pointer type类的函数指针赋值错误,可按以下顺序排查:
- 核对函数指针的返回值类型和实际函数的返回值类型完全一致,注意
bool/bool_t这类别名类型,哪怕底层类型一致只要宏定义不同,也可能被编译器判定为不同类型 - 核对参数数量、每个参数的类型、顺序完全匹配,参数的
const/volatile修饰符差异也会导致类型不兼容 - 嵌入式场景下额外确认函数的调用约定和函数指针要求的调用约定一致
你之前尝试的memcpy、malloc不需要使用,这类问题属于编译期的类型检查错误,和内存分配、内存拷贝无关,强行用内存操作写入地址反而会引发不可预期的运行时异常。
内容的提问来源于stack exchange,提问作者revanth
相关产品推荐
相关产品推荐

