問題:
你有一個由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>
<code class="cpp">fptr my_fptr = 0; reinterpret_cast<void*&>(my_fptr) = gptr;</code>
<code class="cpp">void (**object_ptr)() = &my_ptr; void **ppv = reinterpret_cast<void**>(object_ptr); *ppv = gptr;</code>
這些選項利用了函數指標的位址是物件指標的事實,允許間接使用reinterpret_cast進行轉換。
注意:
這些解決方案不保證在所有平台上工作,並且不被視為標準 C 。使用它們需要您自擔風險。以上是如何在 C 中安全地將 void 指標轉換為函數指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!