Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menghantar `kosong*` dengan Selamat kepada Penunjuk Fungsi dalam C ?

Bagaimanakah Saya Boleh Menghantar `kosong*` dengan Selamat kepada Penunjuk Fungsi dalam C ?

DDD
Lepaskan: 2024-11-03 01:36:02
asal
652 orang telah melayarinya

How Can I Safely Cast a `void*` to a Function Pointer in C  ?

Tuding Penunjuk Fungsi dalam C

Dalam C , menukar lompang* kepada penuding fungsi secara langsung secara amnya tidak dibenarkan. Walau bagaimanapun, terdapat beberapa pendekatan yang mungkin berfungsi bergantung pada pelaksanaan dan platform.

Kaedah 1 (Tingkah Laku Tidak Ditakrifkan):

Kaedah ini melibatkan double reinterpret_casting:

<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

Kaedah 2 (Mengelakkan Penukaran Terus):

Kaedah ini menggunakan langkah perantaraan untuk menyimpan alamat penuding fungsi dalam pembolehubah:

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

Versi Kaedah 2 yang Lebih Lambat tetapi Lebih Telus:

<code class="cpp">void (**object_ptr)() = &my_ptr;

void ** ppv = reinterpret_cast<void**>(object_ptr);

*ppv = gptr;</code>
Salin selepas log masuk

Batasan dan Kaveat:

  • Kaedah ini adalah pelaksanaan- bergantung dan kelakuannya tidak dijamin oleh piawaian C.
  • Ia boleh menyebabkan gelagat yang tidak ditentukan pada sesetengah platform atau dengan penyusun tertentu.
  • Adalah disyorkan untuk sentiasa menyemak kesahihan penuding sebelum menggunakannya sebagai penuding fungsi.

Nota:

Dalam C 0x, kelakuan menukar kekosongan* kepada penuding fungsi disokong secara bersyarat.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghantar `kosong*` dengan Selamat kepada Penunjuk Fungsi dalam C ?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan