错误:从'void *'到'int(*)(const void *,const void *)的无效转换

时间:2015-01-23 10:31:09

标签: c

在编译我的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)

出现错误

您能否建议此代码出现问题以及如何解决此问题。

2 个答案:

答案 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以获取正确的签名。