c - 将 foo(int *) 作为参数传递给 X 中的 foo(void*)

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/

相关文章:

kotlin - 在 Kotlin 中定义数组类型

angular - TS2339 : Property 'text' does not exist

c# - 解析不同的HttpClient

c# - UWP:导航 View 没有完全延伸到标题栏

git - 有没有没有版本提交的 'bump the version' 的方法?

Flutter - 'showSnackBar' 已弃用 - 如何更新?

python - 类型错误 : input expected at most 1 argument,

python - 有没有办法在这个正态分布的区域上色?

Angular 11 - RouterModule - 'router-outlet' 不是已知元素

python - 在 pandas 的 to_markdown() 中抑制科学记数法