gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 09:34:23 26 4
gpt4 key购买 nike

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

关于c - 将 foo(int *) 作为参数传递给 X 中的 foo(void*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66697413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com