[英]C++/C function pointers that return void*
我正在尝试调用一个带参数的函数, void(*)(void*, int, const char*)
,但我无法弄清楚如何将这些参数传递给函数。
例:
void ptr(int);
int function(int, int, void(*)(int));
我试图像这样调用函数:
function(20, 20, ptr(20));
这可能吗?
你做错了一件事 - 你试图在调用'function'之前调用你的'ptr'函数。 你应该做的是只传递一个指向'ptr'的指针并使用'function'中的传递指针调用'ptr',如下所示:
void ptr(int x)
{
printf("from ptr [%d]\n", x);
}
int function(int a, int b , void (*func)(int) )
{
printf( "from function a=[%d] b=[%d]\n", a, b );
func(a); // you must invoke function here
return 123;
}
void main()
{
function( 10, 2, &ptr );
// or
function( 20, 2, ptr );
}
这使:
from function a=[10] b=[2]
from ptr [10]
from function a=[20] b=[2]
from ptr [20]
这就是你想要的
对于
function(20, 20, ptr(20));
工作 - 你必须要像:
// 'ptr' must return sth (int for example)
// if you want its ret val to be passed as arg to 'function'
// this way you do not have to invoke 'ptr' from within 'function'
int ptr(int);
int function(int, int , int);
通常的技巧是使用typedef进行签名:
typedef void signature_t (void*, int, const char*);
请注意,如果没有typedef
,语法就像一个函数声明。 它将signature_t
声明为函数的typedef,因此在实践中你总是会使用指向signature_t
指针。
然后你可以将你的“高阶”函数声明为
int function (int, int, signature_t*);
另见此回复 。
除非我完全误解你的代码,否则你试图通过一个参数传递函数指针
function(20, 20, ptr(20));
这是不正确和非法的。 要将函数作为参数传递到另一个函数,您必须遵循以下语法
function(20, 20, &ptr);
or
function(20, 20, ptr);
尽管我会建议保留'&'以便于阅读
您不能将ptr(20)传递给此函数,因为您只能将指针传递给函数,而不能传递带参数的指针。 您可以阅读有关仿函数的内容,theu将帮助您解决此类问题。 或者另一种解决方案是将签名更改为
int function(int, int, void(*)(void) );
并写功能
void ptr_wrap(void) {ptr(20);}
所以你可以调用function(20, 20, ptr_wrap);
。 但是仿函数可以更优雅的方式解决这个问题。
ptr(20)
是的返回值ptr
,当你通过20
到它。 如果你想传递函数(而不是它的返回值),你应该只写function(20,20,ptr);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.