簡體   English   中英

從“void*”到“void (*)(..)”的無效轉換

[英]Invalid conversion from 'void*' to 'void (*)(..)'

我有錯誤

從 'void*' 到 'void ( )(void , u_int8_t*, u_int8_t*, u_int16_t, void*) {aka void ( )(void , unsigned char*, unsigned char*, short unsigned int, void*)} 的無效轉換' [-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);
}

在 CI 中認為您的代碼可以工作,但 C++ 不會讓您將void*隱式轉換為其他指針類型。 我會做

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

.
.
.
FunFriend handle_friendrequest = (FunFriend)function;

指針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 *作為一種解決方法,但這沒有任何意義。 它根本不會編譯。 看到你問這個問題很奇怪(如果我理解正確的話),因為編譯器抱怨你自己插入到代碼中的一個毫無意義的無效強制轉換。

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

就像錯誤消息所說的那樣。 在您的代碼表達式中,您有(void *)(function)

那是void *類型。 但是,您隨后將其分配給具有函數指針類型的變量。 通常,不可能在函數指針和對象指針之間進行轉換,盡管某些實現可能允許這樣做。

如果Messenger實際上是void *的 typedef,那么您可以刪除(void *)因為functionhandle_friendrequest將具有相同的類型,因此不需要handle_friendrequest

如果Messenger不是void *那么您想要的代碼將具有未定義的行為,因為函數指針具有不同的類型。 考慮重新設計,以便您調用的函數實際上具有與函數指針類型相同的原型。

如果你真的想對未定義的行為進行攻擊,代碼將是:

{
    typedef void HANDLER(void *, uint8_t *, uint8_t *, u_int16_t, void *);
    HANDLER *handle_friendrequest = (HANDLER *)function;
}
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 *

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM