2010-04-14 146 views
11

我已經搜索過,但找不到任何結果(我的術語可能關閉),所以請原諒我,如果之前已經詢問過。在沒有聲明函數指針的情況下調用void *作爲函數

我想知道是否有一種簡單的方法可以在C中調用void*作爲函數,而無需先聲明函數指針,然後爲函數指針指定地址;

即。假設要調用的功能與上面的代碼輸入void(void)

void *ptr; 
ptr = <some address>; 
((void*())ptr)(); /* call ptr as function here */ 

,我得到錯誤C2066:強制轉換爲函數類型是在VC2008

如果這是可能的非法,語法怎麼會不同用於返回類型和多個參數的函數?

回答

22

你投應該是:

((void (*)(void)) ptr)(); 

在一般情況下,這可以通過創建函數指針類型typedef更簡單:

typedef void (*func_type)(void); 
((func_type) ptr)(); 

但是,我應該指出,向函數指針或從函數指針投射普通指針(指向對象的指針)並不嚴格合法(儘管它是交流全稱擴展名)。

+0

正是我在找的,謝謝。 – 2010-04-14 09:26:19

12

當轉換爲函數類型時,我非常困惑。它更容易和更具可讀性的typedef函數指針類型:

void *ptr = ...; 
typedef void (*void_f)(void); 
((void_f)ptr)(); 
11

在C++:reinterpret_cast< void(*)() > (ptr)()

採用reinterpret_cast爲您節省一組混亂的括號和< >清楚地調用本身與衆不同的類型。