2009-10-03 181 views
3

我想寫一個函數指針的映射函數,並將其傳遞給另一個函數,但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

回答

0

這只是抱怨map的第二個參數預期的函數指針類型不同於apply。如果你要麼改變那種類型,要麼(如果安全的話)施放,那就沒問題。

4

爲了解決這個問題,我們需要查看map函數的聲明/簽名。幾乎可以肯定的是函數簽名有一點點區別。解決這個問題的最簡單方法是鍵入一個函數指針類型並在兩個函數中使用它。

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

它適用於我與海灣合作委員會4.3.3和-Wall

雖然我認爲曾經存在重寫了函數「值」參數是指向C:的所有版本中,你可以使用一個更傳統聲明:

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

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