Bolehkah C Menukar Penunjuk Void kepada Penunjuk Fungsi?

Mary-Kate Olsen
Lepaskan: 2024-11-03 04:42:31
asal
755 orang telah melayarinya

Can C   Convert a Void Pointer to a Function Pointer?

Menukar Penunjuk Tidak Sah kepada Penunjuk Fungsi: Kemungkinan Bersyarat dalam C

Masalah

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.

Jawapan

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>
Salin selepas log masuk

Sebagai alternatif:

<code class="cpp">fptr my_ptr = 0;
reinterpret_cast<void*&>(my_ptr) = gptr;</code>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan