Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Saya Boleh Menukar Penunjuk Void kepada Penunjuk Fungsi dalam C?

Bagaimanakah Saya Boleh Menukar Penunjuk Void kepada Penunjuk Fungsi dalam C?

DDD
DDDasal
2024-11-03 21:57:31501semak imbas

How Can I Convert a Void Pointer to a Function Pointer in C  ?

Menghantar Penunjuk Fungsi dalam C

Jenis penukaran penunjuk tidak sah kepada penunjuk fungsi ialah senario biasa dalam pengaturcaraan. Walau bagaimanapun, dalam C , menukar kekosongan kepada penunjuk fungsi secara langsung adalah tidak dibenarkan, seperti yang ditakrifkan oleh piawaian C 98/03. Ini kerana kekosongan, mengikut piawaian, bertujuan untuk menunjuk ke objek, bukan penunjuk fungsi atau penunjuk ahli.

Walaupun pemutus terhad dalam piawaian C 98/03, terdapat cara untuk mencapai penukaran dalam konteks tertentu. Kaedah ini bergantung kepada pelaksanaan dan mungkin berkelakuan berbeza berdasarkan pengkompil dan sistem pengendalian.

Pilihan 1: Castan Tafsiran Semula Berganda

Satu pendekatan ialah menggunakan tafsiran semula berganda cast:

<code class="cpp">void *gptr = dlsym(some symbol...);
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>

Di sini, gptr pertama kali dihantar ke integer panjang, dan kemudian hantaran dilakukan dari panjang kepada jenis penunjuk fungsi sasaran. Pendekatan ini tidak dijamin berfungsi merentas semua platform dan bukan sebahagian daripada standard C.

Pilihan 2: Void dan Manipulasi Alamat**

Kaedah alternatif melibatkan memanipulasi kekosongan** dan alamat:

<code class="cpp">fptr my_ptr = 0;
reinterpret_cast<void**&my_ptr = gptr;</code>

Dalam kes ini, kekosongan digunakan untuk menyimpan alamat penuding fungsi. Dengan memberikan alamat dari gptr kepada void, alamat penuding fungsi boleh diakses secara tidak langsung. Kaedah ini juga bergantung kepada pelaksanaan.

Adalah penting untuk ambil perhatian bahawa teknik ini mengeksploitasi gelagat platform tertentu dan tidak ditakrifkan dengan baik oleh standard C. Walaupun ia mungkin berfungsi dalam kebanyakan kes, adalah penting untuk mengetahui kemungkinan ketidakkonsistenan dan isu mudah alih.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menukar Penunjuk Void kepada Penunjuk Fungsi dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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