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
600 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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan