![](/img/trans.png)
[英]invalid conversion from 'long int' to '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*)
你可以這樣做:
定義新類型:
typedef void (*functiontype) ( void*);
Typecast如下:
callback = (functiontype)myfunc;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.