C:在传递给它的函数中传递函数指针

C:在传递给它的函数中传递函数指针,c,function-pointers,C,Function Pointers,我试图编写一个映射函数,它接受一个函数指针,并将其传递给另一个函数,但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(thin

我试图编写一个映射函数,它接受一个函数指针,并将其传递给另一个函数,但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);

   }

}
void映射(T事物,void应用(int a,int b,void*cl),void*cl);
无效函数(T事物,无效应用(int a,int b,void*cl),void*cl)
{
对于(int i=0;i<10;i++)
{
地图(事物、应用、cl);
}
}
gcc的投诉:

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


有什么想法吗?

只是抱怨
map
的第二个参数所期望的函数指针类型与
apply
的不同。如果您更改该类型或(如果安全)强制转换,则一切正常。

为了帮助解决此问题,我们需要查看map函数的声明/签名。几乎可以肯定的是,函数签名中存在细微的差异。解决此问题的最简单方法是键入一个函数指针类型,并在两个函数中使用它

typedef void (*apply)(int,int,void*);

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

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);
    /* .... */
}

它适用于gcc 4.3.3和
-Wall

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

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

但是,正如我所说,您的示例对我来说很好,除了
typedefint T T
map(1,…)

映射的签名是什么?您的代码对我来说很好,使用gcc 4.3.4(在提供了一些typedef T之后)。你确定你已经发布了给出问题的确切代码吗?你确定这是
map
的声明吗?现在我无法重现这个问题。。。它工作得很好,它是针对一个类的,所以我不能发布确切的代码,但我发现了问题所在,应用函数对每种类型的map函数采用了不同的“t”。谢谢