2012-06-22 68 views
0

所以我試圖解決這個警告:nonstandard conversion between pointer to function and pointer to data我一直沒有找到一個好方法來做到這一點。這一切都在C而不是C++中完成。指針與函數指針錯誤之間的轉換

目前,我有一個頭文件:

typdef struct myConnection_s 
{ 
    ... 
    void* Callback 
} myConnection_t, *Connection 


typdef HRESULT (*HttpHook)(Connection, char*); 

foo.c中我有其他的文件:

.... 
Connection myConnection; 
... 

HttpHook myHook = (HttpHook) myConnection->Callback; 
... 
return myHook(.....); 

是否有解決這一問題的警告,而不必改變太多的好辦法?如果不是,重寫這個的最好方法是什麼?

謝謝!

回答

1
typedef struct myConnection_s 
{ 
    /* ... */ 
    HttpHook Callback; 
} myConnection_t, *Connection; 

您還可以再落明確投以後:

HttpHook myHook = myConnection->Callback; 

if (myHook) 
    myHook(/* ... */); 

編輯:看起來你有一個順序的問題...試試這個:

struct myConnection_s; 

typedef HRESULT (*HttpHook)(struct myConnection_s *, char*); 

typedef struct myConnection_s 
{ 
    /* ... */ 
    HttpHook Callback; 
} myConnection_t, *Connection; 
+0

這是最初的反應,但問題是typedef引用連接,所以我得到一個錯誤,因爲HttpHook是連接後定義的,如果我切換它們,那麼我也會得到一個錯誤。 – Jtello

+0

@Jtello爲什麼你不能在struct之前定義'HttpHook'? –

+0

@Jtello看到我的編輯 –

0

this answer到類似的問題。 C標準不允許將數據指針轉換爲函數指針,反之亦然。您可能可以在某些平臺上執行此操作,但它不是可移植代碼。

肖恩布萊特的答案是處理這個問題的正確方法。你也可以使用泛型函數指針(無返回值,不帶參數)並將其轉換爲該類型的類型,但在我看來這很危險。如果您使用特定的函數指針類型,編譯器會在您嘗試使用具有不同簽名的函數時發出警告。