如何解决C语言bsearch的[-Wincompatible-pointer-types]指针类型不兼容警告
解决bsearch回调函数指针类型不兼容的警告问题
编译你提供的代码时,出现bsearch第5个参数指针类型不兼容的警告,根源在于bsearch要求的比较函数签名是int (*)(const void*, const void*),但你定义的cmp_mydata_ivalue参数是my_data*,两者类型不匹配。以下是两种通过类型相关修改解决警告的方法:
方法一:修改比较函数参数为标准类型(推荐)
直接调整比较函数的参数类型,使其符合bsearch的要求,内部再转换为目标结构体指针:
int cmp_mydata_ivalue(const void* item1 , const void* item2 ) { const my_data* a = (const my_data*)item1; const my_data* b = (const my_data*)item2; if(a->iValue < b->iValue) return -1; if(a->iValue > b->iValue) return 1; return 0; }
修改后直接将cmp_mydata_ivalue传入bsearch即可,无需额外类型转换,完全符合C标准规范,不会产生警告。
方法二:对函数指针进行强制类型转换
如果不想修改原比较函数,可以在传递给bsearch时,将函数指针强制转换为bsearch要求的类型:
my_data *foundItem = (my_data*) bsearch(&srchitem, datalist, 20, sizeof(my_data), (int (*)(const void*, const void*))cmp_mydata_ivalue);
这种方式要注意:原函数未使用const修饰参数,但bsearch不会修改传入的元素,因此实际操作是安全的。不过这种写法不如第一种直观,推荐优先使用方法一。
内容的提问来源于stack exchange,提问作者asdf
相关产品推荐
相关产品推荐

