A 有一个函数:
void somefunc(void func(void *)) { ... }
void foo(int *num) {...}
我试图将 foo 作为参数传递给 somefunc 但收到警告。 执行此操作的正确方法是什么?
最佳答案
将一个参数作为一个带有一个或多个void *
参数的函数是实现某些泛型算法的常用方法。 (这个答案假定在这段代码中就是这种情况。其他可能性存在但不太可能。) somefunc
的参数 func
提供了一个回调函数,该回调函数 somefunc
用于在不知道数据类型的情况下对数据进行操作。
请注意,当参数声明为函数时,void func(void *)
,它会自动调整为指向函数的指针,void (*func)(void *)
。去掉名字,我们有抽象类型,void (*)(void *)
。
您不能为 void (*)(void *)
参数传递 void (*)(int *)
参数,因为它们是不兼容的类型。并且您不应该尝试使用强制转换将 foo
参数强制转换为参数类型,因为使用该转换后的指针调用 void (int *)
函数的行为不是由 C 标准定义。一个合适的解决方案是传递一个指向预期类型的函数的指针。您可以为此创建一个新功能:
void FooWrapper(void *p) { foo(p); }
然后你可以将FooWrapper
传递给somefunc
。当 somefunc
调用 FooWrapper
时,它会传递给它一个 void *
。当 FooWrapper
调用 foo
时,那个 void *
将自动转换为 int *
。 (据推测,foo
是事先声明的,带有原型(prototype)。)只要 FooWrapper
传递的 void *
起源于指向某个 的指针code>int
,这种从 void *
返回到 int *
的转换是由 C 标准定义的,所以这是正确的代码。
或者,您可以修改 foo
以获取 void *
参数并在内部将其转换为 int *
,而不是创建包装器:
void foo(void *VoidNum)
{
int *num = VoidNum;
…
}
然后你可以将 foo
直接传递给 somefunc
。
https://stackoverflow.com/questions/66697413/