簡體   English   中英

無效轉換從void *到void(*)(void *)[ - fpermissive]

[英]invalid conversion from void* to void(*)(void*)[-fpermissive]

這個問題是關於線程的問題,但我有一個更簡單的案例。(初學者)
我在c ++的不同編譯器中嘗試了代碼,但是無法工作。
請告知如何替換該行: callback = (void*)myfunc; // - > error

typedef struct _MyMsg {
        int appId;
        char msgbody[32];
} MyMsg;    
void myfunc(MyMsg *msg)
{
        if (strlen(msg->msgbody) > 0 )
                printf("App Id = %d \n Msg = %s \n",msg->appId, msg->msgbody);
        else
                printf("App Id = %d \n Msg = No Msg\n",msg->appId);
}    
/*
 * Prototype declaration
 */
void (*callback)(void *);    
int main(void)
{
        MyMsg msg1;
        msg1.appId = 100;
        strcpy(msg1.msgbody, "This is a test\n");    
        /*
         * Assign the address of the function 'myfunc' to the function
         * pointer 'callback'
         */                 
//line throws error: invalid conversion from void* to void(*)(void*)[-fpermissive]    
        callback = (void*)myfunc; //--> error               
        /*
         * Call the function
         */
        callback((MyMsg*)&msg1);    
        return 0;
}

問題是callback不是一個void指針,它是一個指向函數的指針。 因此,要關閉警告,您需要轉換為正確的類型:

callback = (void (*)(void *))myfunc;

請注意,這將消除警告,但不能保證工作 - 雖然您可以將函數指針類型強制轉換為其他函數指針類型,但調用結果函數指針(不先將其強制轉換)是未定義行為。

現在在大多數機器上,所有指針都具有相同的內部位表示。 特別是, MyMsg *void *將是相同的,所以這實際上工作正常。 但它不能保證。 要嚴格遵守標准,您應該將myfunc更改為:

void myfunc(void *msg_)
{
    MyMsg *msg = (MyMsg *)msg_;
    :

現在它具有與callback相同的簽名,因此您可以在不進行轉換的情況下進行分配。 myfunc可能是一個noop,但需要嚴格遵守。

是的,你的類型轉換是錯誤的:

 callback = (void*)myfunc;
              ^
               is void*  but Not void (*)(void*)

你可以這樣做:

  1. 定義新類型:

     typedef void (*functiontype) ( void*); 
  2. Typecast如下:

     callback = (functiontype)myfunc; 

暫無
暫無

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

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