void dispatch_for(dispatch_queue_t *queue, long number, void (* work)(long)){
int loop = number;
int i;
task_t *ctask;
for(i = 0; i<loop;i++){
ctask = create_task((void *)work,number,"for_test");
dispatch_async(queue,ctask);
}
}
task_t *task_create(void (* work)(void *), void *param, char* name){
//do something
}
我正在将工作作为一个函数,需要将它传递给函数create_task ..(第一个参数)
我该怎么办呢?
答案 0 :(得分:4)
没有括号的函数的名称是指向该函数的指针:
void work(void) {
...;
}
void main(void) {
task_create(work, void, void);
}
答案 1 :(得分:1)
只需像任何其他参数一样使用标识符:
dispatch_for(queue, number, work);
答案 2 :(得分:1)
由于您使用的是C,work
类型为void (*)(long)
,但您希望将其设为void (*)(void*)
,只需重新投射work
的类型(这可以通过使用typedef最简单地完成)
//declare somewhere at a global level
typedef void (*task_create_func)(void*);
//at the point where you want to call task_create
task_create((task_create_func)work, PARAM1, PARM2);
或者,如果您不想处理typedef,您可以在调用点使用所需的指针类型进行转换,如下所示:
task_create((void (*)(void*))work, PARAM1, PARAM2);
答案 3 :(得分:1)
最简单的事情是想要的函数类型的typedef。所以你可以做到
typedef void workfunc_t(void *);
workfunc_t sample_workfunc; // in order to ensure type-correctness
void workfunc_t(void *)
{
// ...
}
void dispatch_for(dispatch_queue_t *queue, long number, workfunc_t * work)
{
int loop = number;
int i;
task_t *ctask;
for(i = 0; i<loop;i++) {
ctask = create_task(work, number, "for_test");
dispatch_async(queue,ctask);
}
}
task_t *task_create(workfunc_t work, void *param, char* name){
//do something
}
答案 4 :(得分:1)
函数work
在dispatch_for
和task_create
中没有相同的签名(参数是一个指针,另一个是long)
你想在两种情况下使用相同的功能似乎很奇怪