C语言:将函数指针作为参数传递给另一个函数时,它是如何传递的?

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的警告:

警告:从不兼容的指针类型传递' map '的第二个参数

有什么想法吗?


3
map 的签名是什么? - strager
你的代码在我的gcc 4.3.4上编译没有问题(提供了一些typedef T)。你确定你发布了导致问题的确切代码吗? - Martin v. Löwis
你确定那是map的声明吗?现在我无法复现问题...它正常工作了。 - DigitalRoss
好的,这是为了一个课程,所以我不能发布确切的代码,但我找出了问题所在,apply函数对于每种类型的映射函数都采用了不同的“T”。谢谢。 - Walker Holahan
4个回答

4
为了解决这个问题,我们需要查看map函数的声明/签名。几乎可以确定函数签名存在轻微差异。最简单的解决方法是typedef出一个函数指针类型,在两个函数中使用它。
typedef void (*apply)(int,int,void*);

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

0

对于我来说,使用gcc 4.3.3和-Wall可以正常工作。

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

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

但是,就像我说的那样,你的例子对我来说很好,除了 typedef int Tmap(1, ...) 之外没有改变。


0

它只是抱怨map的第二个参数所期望的函数指针类型与apply的不同。如果你改变了那个类型,或者(如果安全)进行强制转换,那么就没问题了。


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