传递函数指针 - 类型问题

时间:2013-10-23 21:45:31

标签: c function-pointers

我有一个需要这样的参数的函数

void priqueue_init(priqueue_t *q, int(*comparer)(void *, void *))

我希望它能够接受任何类型的参数。

在另一个文件中我首先输入typedef

typedef int (*comp_funct)(job_t*, job_t*);

我要传递的功能......

int fcfs_funct1(job_t* a, job_t* b)
{
  int temp1 = a->arrival_time;
  int temp2 = b->arrival_time;

  return (temp1 - temp2);
}

对priqueue_init的调用:

priqueue_init(pri_q, choose_comparator(sched_scheme));

最后,我的choose_comparator函数:

comp_funct choose_comparator(scheme_t scheme)
{
    if (sched_scheme == FCFS)
        return fcfs_funct1;

    return NULL;
}

我在调用priqueue_init时出错。

    libscheduler/libscheduler.c: In function ‘add_to_priq’:
libscheduler/libscheduler.c:125:3: error: passing argument 2 of ‘priqueue_init’ from incompatible pointer type [-Werror]
In file included from libscheduler/libscheduler.c:5:0:
libscheduler/../libpriqueue/libpriqueue.h:25:8: note: expected ‘int (*)(void *, void *)’ but argument is of type ‘comp_funct’

我在哪里挂断电话?定义priqueue_init的文件不知道job_t类型。我认为用无效参数去做是可行的。

2 个答案:

答案 0 :(得分:3)

int (*comparer)(void *, void *)int (*comp_funct)(job_t*, job_t*)不兼容。将它们更改为匹配,或添加类型转换。

指针(在您的情况下为void *job_t *)不必具有相同的大小,因此编译器正确地给出了错误。由于它们在大多数机器上大小相同,因此简单的类型转换可能会解决您的问题,但您会引入一些潜在的不可移植性。

答案 1 :(得分:2)

要与函数类型签名兼容,您的比较函数必须采用void*个参数,并在内部投射它们:

int fcfs_funct1(void* a, void* b)
{
  int temp1 = ((job_t*)a)->arrival_time;
  int temp2 = ((job_t*)b)->arrival_time;

  return (temp1 - temp2);
}