我正在尝试创建一个函数,它将存储和重复给定为特定时间或重复给定值的参数的另一个函数.
但是当你想传递一个函数作为参数时,你必须先掌握所有的参数.
如果我想将函数作为一个参数传递给函数,而另一个参数又如何呢?
但是当你想传递一个函数作为参数时,你必须先掌握所有的参数.
如果我想将函数作为一个参数传递给函数,而另一个参数又如何呢?
void AddTimer(float time,int repeats,void (*func),params); // I know params has no type and that (*func) is missing parameters but it is just to show you what I mean
提前致谢
解决方法@H_403_10@
就现代C而言,dribeas的答案是正确的.
为了感兴趣,C世界还有一个简单的低科技解决方案,尽管如此,它在C工作.而不是允许任意参数,将函数定义为void(* func)(void *),并使“params”为void *.调用者的工作就是定义一些包含参数的结构体,并管理其生命周期.通常调用者也将为真正需要调用的函数编写一个简单的包装器:
void myfunc(int,float); // defined elsewhere
typedef struct {
int foo;
float bar;
} myfunc_params;
void myfunc_wrapper(void *p) {
myfunc_params *params = (myfunc_params *)p;
myfunc(params->foo,params->bar);
}
int main() {
myfunc_params x = {1,2};
AddTimer(23,5,myfunc_wrapper,&x);
sleep(23*5 + 1);
}
实际上你想要“点火和忘记”计时器,所以如果你使用这个方案,你可能还需要一种方法,一旦所有的启动完成,定时器就可以释放用户数据指针.
显然这种类型安全性有限.原则上应该不重要,因为提供函数指针和用户数据指针的人不应该有很大的困难,确保它们匹配.实际上,当然人们会发现编写错误的方法,以及如何责怪你,因为他们的编译器没有告诉他们有关错误;-)
为了感兴趣,C世界还有一个简单的低科技解决方案,尽管如此,它在C工作.而不是允许任意参数,将函数定义为void(* func)(void *),并使“params”为void *.调用者的工作就是定义一些包含参数的结构体,并管理其生命周期.通常调用者也将为真正需要调用的函数编写一个简单的包装器:
void myfunc(int,float); // defined elsewhere typedef struct { int foo; float bar; } myfunc_params; void myfunc_wrapper(void *p) { myfunc_params *params = (myfunc_params *)p; myfunc(params->foo,params->bar); } int main() { myfunc_params x = {1,2}; AddTimer(23,5,myfunc_wrapper,&x); sleep(23*5 + 1); }
实际上你想要“点火和忘记”计时器,所以如果你使用这个方案,你可能还需要一种方法,一旦所有的启动完成,定时器就可以释放用户数据指针.
显然这种类型安全性有限.原则上应该不重要,因为提供函数指针和用户数据指针的人不应该有很大的困难,确保它们匹配.实际上,当然人们会发现编写错误的方法,以及如何责怪你,因为他们的编译器没有告诉他们有关错误;-)