Rumah > pembangunan bahagian belakang > C++ > Bolehkah C Menukar Penunjuk Void kepada Penunjuk Fungsi?

Bolehkah C Menukar Penunjuk Void kepada Penunjuk Fungsi?

Mary-Kate Olsen
Lepaskan: 2024-11-03 04:42:31
asal
832 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!

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