C:传递一个函数指针在它传递给函数

问题描述:

我想写一个函数指针的映射函数,并将其传递给另一个函数,但gcc对我大喊大叫。C:传递一个函数指针在它传递给函数

这是我想要做的一个想法。

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兼容的指针类型

任何想法?

+3

以外没有任何变化,'map'的签名是什么? – strager 2009-10-03 19:08:51

+0

你的代码适合我编译,使用gcc 4.3.4(在提供了一些typedef T之后)。你确定你已经发布了提供该问题的**确切**代码吗? – 2009-10-03 19:19:06

+0

你确定这是'map'的声明吗?现在我不能重现这个问题......它的工作原理 – DigitalRoss 2009-10-03 19:31:51

这只是抱怨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); 
    /* .... */ 
} 

它适用于我与海湾合作委员会4.3.3和-Wall

虽然我认为曾经存在重写了函数“值”参数是指向C:的所有版本中,你可以使用一个更传统声明:

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

但是,就像我说的,你的榜样工作正常我除了typedef int Tmap(1, ...)