在编译我的C文件时,我收到以下错误:
error: invalid conversion from 'void*' to 'int (*)(const void*, const void*)'
error: initializing argument 1 of 'void* bsearch(int (*)(const void*, const void*))'
以下是一些代码段:
static int
testfucn(const char *func, const teststruct *array)
{
return (strcmp(func, array->name));
}
int
test(char *fcn)
{
if (bsearch((void*)testfucn))
return(1);
else
return(0);
}
第bsearch((void*)testfucn)
行
您能否建议此代码出现问题以及如何解决此问题。
答案 0 :(得分:1)
错误非常明确 - 您正在传递void*
(由您的显式转换获得),而函数需要int (*)(const void*, const void*)
。没有从“指向void
”的指针到“指向函数的指针”的隐式转换,因此错误。
我相信你可以将函数转换为所请求的类型:
bsearch((int (*)(const void*, const void*)testfucn);
但请注意,虽然它可能(似乎)在实践中起作用,但它会调用未定义的行为。
正确的,类型安全的解决方案是实际声明一个具有适当签名的函数,可能作为实际函数的包装器:
static int
testfucn_for_bsearch(const void *func, const void *array)
{
return testfucn(func, array);
}
/* ... */
bsearch(testfucn_for_bsearch);
答案 1 :(得分:0)
移除演员。你不能在数据(void *
)和函数指针之间进行转换,参数应该是一个函数指针。
同时修复您的功能签名,它与bsearch()
回调的预期签名不匹配。请参阅the manual page以获取正确的签名。