簡體   English   中英

將void *作為函數調用而不聲明函數指針

[英]Call a void* as a function without declaring a function pointer

我已經搜索過但找不到任何結果(我的術語可能已關閉)所以請原諒我,如果以前曾經問過這個問題。

我想知道是否有一種簡單的方法可以在沒有先聲明函數指針然后為函數指針分配地址的情況下將void*作為C函數調用。

即。 假設要調用的函數是void(void)

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

用上面的代碼,我得到錯誤C2066:在VC2008中強制轉換為函數類型是非法

如果可能,具有返回類型和多個參數的函數的語法有何不同?

你的演員應該是:

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

通常,通過為函數指針類型創建typedef可以使這更簡單:

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

但是,我應該指出,向函數指針或從函數指針投射普通指針(指向對象的指針)在標准C中並不嚴格合法(盡管它是常見的擴展)。

在轉換為函數類型時,我非常困惑。 鍵入dede函數指針類型更容易,更易讀:

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

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

使用reinterpret_cast可以為您節省一組令人困惑的括號,而< >明確地將類型與調用本身區分開來。

暫無
暫無

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

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