Mendapatkan penunjuk tidak sah melalui dlsym(), matlamatnya adalah untuk gunakan fungsi yang dirujuk oleh penunjuk itu. Percubaan penukaran melalui casting menggunakan static_cast atau reinterpret_cast telah gagal, tidak seperti cast gaya C.
Penukaran langsung penuding kosong kepada penuding fungsi tidak dibenarkan dalam C 98/03. Walau bagaimanapun, C 0x menawarkan sokongan bersyarat, membenarkan pelaksanaan untuk menentukan tingkah laku.
Pendekatan Tingkah Laku Tidak Ditakrifkan:
Walaupun tidak ditentukan oleh standard, kod berikut mungkin berfungsi kebanyakan platform:
<code class="cpp">void *gptr = dlsym(some symbol..); typedef void (*fptr)(); fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
Sebagai alternatif:
<code class="cpp">fptr my_ptr = 0; reinterpret_cast<void*&>(my_ptr) = gptr;</code>
Pendekatan Kompleks tetapi Mudah Alih:
Kaedah ini mengeksploitasi fakta bahawa alamat penuding fungsi ialah penunjuk objek:
<code class="cpp">// Get address as object pointer void (**object_ptr)() = &my_ptr; // Convert to void** (also an object pointer) void **ppv = reinterpret_cast<void**>(object_ptr); // Store address from 'gptr' in memory cell pointed to by 'ppv' *ppv = gptr;</code>
Pendekatan ini kekal tidak ditentukan dalam standard tetapi harus berfungsi dengan baik pada kebanyakan pelaksanaan.
Atas ialah kandungan terperinci Bolehkah C Menukar Penunjuk Void kepada Penunjuk Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!