C语言按接口实现函数时给函数指针参数命名编译报错如何解决
问题原因及修复方案
编译错误1:unknown type name ‘order’
- 原因:
order是枚举类型名,C语言中直接写order不会被识别为合法类型,必须加enum前缀,或者使用已经定义好的函数指针别名cmp_fun。你在tree_member的实现里直接写order (*funcptr)属于类型写法错误。
编译错误2:conflicting types for ‘tree_insert’
- 原因:接口定义中要求比较函数的返回值类型是
enum order,你在实现里把函数指针的返回值写成了int,参数类型和声明的tree_insert原型不匹配,因此触发类型冲突报错。
后续尝试写法错误原因
你写的cmp_fun (*funcptr)属于二级函数指针类型,因为cmp_fun本身已经被typedef定义为「返回enum order、接收两个const void*参数的函数指针」,额外加*相当于定义了「指向cmp_fun类型指针的指针」,和接口要求的参数类型不匹配。
正确写法
你可以任选以下两种写法之一实现函数:
写法1:直接使用typedef定义的别名(推荐)
bool tree_member(cmp_fun funcptr, const void* test_value, const struct tree* my_tree){ // 函数实现 } const struct tree* tree_insert(cmp_fun funcptr, const void* insert_value, const struct tree* my_tree){ // 函数实现 }
写法2:完整写全函数指针定义
bool tree_member(enum order (*funcptr)(const void *x, const void *y), const void* test_value, const struct tree* my_tree){ // 函数实现 } const struct tree* tree_insert(enum order (*funcptr)(const void *x, const void *y), const void* insert_value, const struct tree* my_tree){ // 函数实现 }
内容的提问来源于stack exchange,提问作者codeymccodeface
相关产品推荐
相关产品推荐

