2014-04-01 23 views
-1

轉換無效我有錯誤從 '無效*' 到 '無效(*)(..)'

從 '無效*' 到「空隙()(空隙,u_int8_t *無效的轉換, u_int8_t *,u_int16_t,無效*){又名空隙()(空隙,無符號字符*,無符號字符*,短無符號整型,無效*)}」 [-fpermissive]

void m_callback_friendrequest(Messenger *m, void (*function)(Messenger *m, u_int8_t *, u_int8_t *, u_int16_t, void *), void *userdata) 
{ 
    void (*handle_friendrequest)(void *, u_int8_t *, u_int8_t *, u_int16_t, void *) = (void *)(function);//->error 
    callback_friendrequest(&(m->fr), handle_friendrequest, m, userdata); 
} 
+2

還有呢?你有什麼問題?在你的代碼中,你顯式地將'function'轉換爲'void *'類型,然後嘗試使用結果的'void *'作爲函數指針的初始值。這不起作用。這是編譯器告訴你的。你爲什麼把'function'封裝成'void *'? – AnT

+0

@AndreyT人應該停止發佈淺藍色的評論。這是可怕的和難以閱讀: –

回答

0

在CI認爲你的代碼可以工作,但C++不會讓你隱式投射void*變成其他指針類型。我會做

typedef void (*FunFriend)(void *, u_int8_t *, u_int8_t *, u_int16_t, void *); 

. 
. 
. 
FunFriend handle_friendrequest = (FunFriend)function; 
+0

在C中,代碼將同樣無效。-1,因爲你不應該鑄造,或者該函數已經是正確的類型,並且鑄件什麼都不做,或者函數不是正確的類型(因爲它在這裏),並且強制轉換隻會抑制正確和有用的錯誤信息。 – hvd

+0

如果系統對'void *'使用與'Messenger *'相同的表示(幾乎所有系統都這樣做) ,那麼代碼很容易的工作。當然,這通常是不可取的依賴未定義行爲,但根據OP的情況下,它可能是最經濟的選擇。 –

+1

C允許隱式的從空管型,這就是爲什麼你可以做' foo * bar = malloc(sizeof(foo))'在C中,而不是C++。至於cast:是的,他應該定義一個包裝函數,它接受一個'void *'作爲第一個參數並傳遞它。將需要從'void *'強制轉換爲'Message *'。 –

0

指針handle_friendrequest已鍵入

void (*)(void *, u_int8_t *, u_int8_t *, u_int16_t, void *) 

指針function已鍵入

void (*)(Messenger *, u_int8_t *, u_int8_t *, u_int16_t, void *) 

這是兩個不同的函數指針類型,它們是相互完全不兼容。您不能使用function來初始化handle_friendrequest期間。

看起來您試圖將function改爲void *作爲解決方法,但這沒有任何意義。它根本不會編譯。看到你問這個問題很奇怪(如果我理解正確),因爲編譯器正在抱怨你自己插入代碼中的無意義的無效代碼。

您必須確保兩個函數指針具有相同的類型,包括相同的參數列表。這將解決問題並消除對任何演員的需求。只要參數列表不同,除了醜陋的黑客之外,沒有任何解決方案。

0

正如錯誤消息所述。在您的代碼表達式中,您有(void *)(function)

這是類型void *。然而,你然後將它分配給一個帶有函數指針類型的變量。通常,函數指針和對象指針之間不可能進行轉換,儘管有些實現可能允許它。

如果Messenger實際上是void *一個typedef,那麼你可以只取出(void *)因爲functionhandle_friendrequest將具有相同的類型,所以不投是必要的。

如果Messenger不是void *那麼您的預期代碼將有未定義的行爲,因爲函數指針有不同的類型。考慮重新設計你的設計,使得你調用的函數實際上與函數指針的類型具有相同的原型。

如果你真的想公牛在與不確定的行爲,該代碼將是:

{ 
    typedef void HANDLER(void *, uint8_t *, uint8_t *, u_int16_t, void *); 
    HANDLER *handle_friendrequest = (HANDLER *)function; 
} 
0
void (*handle_friendrequest)(void *, u_int8_t *, u_int8_t *, u_int16_t, void *) = 
     (void (*)(void*, u_int8_t*, u_int8_t*, u_int16_t, void*))function; 

當然功能必須意識到,它可能需要void*,不Messenger *