3

我正在尝试编写一个映射函数,它接受一个函数指针,并将其传递给另一个函数,但 gcc 对我大喊大叫。

这是我正在尝试做的事情的一个想法。

void map(T thing, void apply(int a, int b, void *cl), void *cl);

void function(T thing, void apply(int a, int b, void *cl), void * cl)
{

   for(int i = 0; i < 10; i++)
   {

      map(thing, apply, cl);

   }

}

gcc的投诉:

警告:从不兼容的指针类型传递“地图”的参数 2

有任何想法吗?

4

4 回答 4

4

为了帮助解决这个问题,我们需要查看 map 函数的声明/签名。几乎可以肯定,函数签名略有不同。解决这个问题的最简单方法是 typedef 出一个函数指针类型并在两个函数中使用它。

typedef void (*apply)(int,int,void*);
于 2009-10-03T19:08:36.577 回答
2

你不能传递函数。您需要将指针传递给函数。

void map(T thing, void (*apply)(int a, int b, void *cl), void *cl);
void function(T thing, void (*apply)(int a, int b, void *cl), void * cl)
{
    /* ... */
    map(thing, apply, cl);
    /* .... */
}
于 2009-10-03T19:25:50.187 回答
0

map它只是抱怨第二个参数所期望的函数指针类型与apply. 如果您更改该类型,或者(如果安全)强制转换,那就没问题了。

于 2009-10-03T19:07:32.930 回答
0

它适用于我的 gcc 4.3.3 和-Wall.

虽然我认为曾经存在的所有 C 版本都将函数“值”参数重写为指针,但您可以使用更传统的声明:

void function(T thing, void (*f)(int a, int b, void *cl), void * cl)

但是,就像我说的,你的例子对我来说很好,除了typedef int T, 和map(1, ...)

于 2009-10-03T19:30:06.253 回答