将函数作为参数传递

时间:2011-08-12 12:20:01

标签: c function parameters function-pointers function-parameter

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 ..(第一个参数)
我该怎么办呢?

5 个答案:

答案 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)

函数workdispatch_fortask_create中没有相同的签名(参数是一个指针,另一个是long)

你想在两种情况下使用相同的功能似乎很奇怪