首頁 > 後端開發 > C++ > 主體

如何在 C 中安全地將 void 指標轉換為函數指標?

Susan Sarandon
發布: 2024-11-05 00:43:02
原創
598 人瀏覽過

How to Safely Cast a Void Pointer to a Function Pointer in C  ?

C 中的函數指標轉換

問題:

你有一個由dlsym() 傳回的void 指標,並且你需要呼叫這個void指標指向的函數。您已嘗試使用 static_cast 和 reinterpret_cast 進行強制轉換,但都無法運作。你有什麼選擇?

答案:

C 98/03 中不允許直接將 void 指標轉換為函數指標。它可能在 C 0x 中有條件地支持,但其行為是實現定義的。

非標準解決方案:

儘管標準含糊不清,但仍有一些非標準解決方案:

可能適用於大多數平台的標準解決方案,儘管它們被視為未定義行為:

<code class="cpp">typedef void (*fptr)();
fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
登入後複製
選項1:

<code class="cpp">fptr my_fptr = 0;
reinterpret_cast<void*&>(my_fptr) = gptr;</code>
登入後複製
選項 2:

<code class="cpp">void (**object_ptr)() = &my_ptr;
void **ppv = reinterpret_cast<void**>(object_ptr);
*ppv = gptr;</code>
登入後複製
選項3(慢動作):

這些選項利用了函數指標的位址是物件指標的事實,允許間接使用reinterpret_cast進行轉換。

注意:

這些解決方案不保證在所有平台上工作,並且不被視為標準 C 。使用它們需要您自擔風險。

以上是如何在 C 中安全地將 void 指標轉換為函數指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!