将函数作为参数传递

4
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的第一个参数。
我应该如何传递它?


3
“create_task”和“task_create”这两个函数应该是相同的函数吗? - Paul R
2
有什么错误/问题?您应该能够直接传递 work。同时请检查拼写,是 task_create 还是 create_task?最好使用 typedef void (*workfunction)(void*);,这样如果有必要,您可以进行强制转换 (workfunction)work - Kerrek SB
5个回答

4

函数名称不带括号表示该函数的指针:

void work(void) {
...;
}

void main(void) {
task_create(work, void, void);
}

我认为OP想要转发入口参数work,但它的类型略有不同。 - Kerrek SB

1

只需像使用其他参数一样使用标识符:

dispatch_for(queue, number, work);

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);

或者,如果您不想处理typedefs,您可以在调用点使用所需的指针类型进行转换,如下所示:

task_create((void (*)(void*))work, PARAM1, PARAM2); 

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
}

1

work函数在dispatch_fortask_create中的签名不同(一个参数是指针,另一个是长整型)

你想在两种情况下使用相同的函数似乎有些奇怪


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接