C 将具有特定返回和参数类型的函数的地址传递给另一个接受具有泛型类型参数的泛型类型函数的函数

C 将具有特定返回和参数类型的函数的地址传递给另一个接受具有泛型类型参数的泛型类型函数的函数,c,C,我正在尝试传递类型为的函数: int*(*)(int*,int*) 对于接受为参数的函数: 无效*(*)(无效*,无效*) 有什么方法可以做到这一点吗?您总是可以用C显式地强制转换东西——因此您可以强制转换(void*(*)(void*,void*))func来传递函数指针。问题是,如果被调用方随后尝试通过函数指针调用,而没有首先将其返回到int*(*)(int*,int*),则结果是未定义的行为 现在,在您的特定ABI上,这可能无论如何都会起作用(所有指针类型都具有相同的表示形式,并且以相同的

我正在尝试传递类型为的函数:

int*(*)(int*,int*)

对于接受为参数的函数:

无效*(*)(无效*,无效*)


有什么方法可以做到这一点吗?

您总是可以用C显式地强制转换东西——因此您可以强制转换
(void*(*)(void*,void*))func
来传递函数指针。问题是,如果被调用方随后尝试通过函数指针调用,而没有首先将其返回到
int*(*)(int*,int*)
,则结果是未定义的行为


现在,在您的特定ABI上,这可能无论如何都会起作用(所有指针类型都具有相同的表示形式,并且以相同的方式作为参数传递),因此您可能会忽略它,但它的行为仍然没有定义。这是一个很好的例子,说明标准未明确规定可能被滥用的内容。可以说,这类事情至少应该是实现定义的,而不是未定义的。

您总是可以在C中显式地强制转换东西——因此您可以强制转换
(void*(*)(void*,void*))func
,以传递函数指针。问题是,如果被调用方随后尝试通过函数指针调用,而没有首先将其返回到
int*(*)(int*,int*)
,则结果是未定义的行为


现在,在您的特定ABI上,这可能无论如何都会起作用(所有指针类型都具有相同的表示形式,并且以相同的方式作为参数传递),因此您可能会忽略它,但它的行为仍然没有定义。这是一个很好的例子,说明标准未明确规定可能被滥用的内容。可以说,这类事情至少应该是实现定义的,而不是未定义的。

您尝试过吗?如果不起作用,问题出在哪里?我一直遇到这个错误:不兼容的函数指针类型将“int()(int,int*)”传递给类型为“void*()(void*,void*)”的参数[-Werror,-Wincompatible函数指针类型]不,你不能这样做。接收函数对函数指针做什么?它调用指向函数了吗?如果是,用什么参数?你试过了吗?如果不起作用,问题出在哪里?我一直遇到这个错误:不兼容的函数指针类型将“int()(int,int*)”传递给类型为“void*()(void*,void*)”的参数[-Werror,-Wincompatible函数指针类型]不,你不能这样做。接收函数对函数指针做什么?它调用指向函数了吗?如果是,用什么参数?谢谢你的澄清,这很有帮助,我的问题现在解决了:)谢谢你的澄清,这很有帮助,我的问题现在解决了:)