Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menghantar Antara kekosongan* dan Penunjuk ke Fungsi Ahli dalam C ?

Bagaimana untuk Menghantar Antara kekosongan* dan Penunjuk ke Fungsi Ahli dalam C ?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-29 07:18:021069semak imbas

How to Cast Between void* and a Pointer to Member Function in C  ?

Kesukaran Casting antara void* dan Penunjuk kepada Fungsi Ahli

Apabila bekerja dengan perpustakaan C, pembangun sering menghadapi cabaran dalam menghantar antara void* dan penunjuk ke fungsi ahli . Artikel ini bertujuan untuk menangani isu khusus yang berkaitan dengan topik ini dan menyediakan penyelesaian yang berdaya maju.

Pernyataan Masalah

Dalam percubaan untuk memudahkan pengikatan objek C kepada penterjemah Lua, fungsi, call_int_function, telah direka menggunakan GCC 4.4. Walau bagaimanapun, baris reinterpret_cast)(int, int)>(lua_touserdata(L, lua_upvalueindex(1))) menimbulkan ralat kompilasi, menunjukkan hantaran tidak sah daripada void kepada penuding kepada fungsi ahli.

Punca Ralat

GCC menganggap pelakon daripada batal kepada batal (T::)(int, int) tidak sah kerana penunjuk kepada ahli adalah berbeza daripada petunjuk biasa. Ia bukan alamat dalam erti kata tradisional, dan pelaksanaannya berbeza-beza dengan ketara merentas penyusun.

Penyelesaian Alternatif

Penyelesaian kepada isu ini terletak pada membungkus fungsi ahli dalam fungsi biasa. Fungsi percuma harus mengambil objek sebagai hujah pertamanya. Pendekatan ini menghapuskan keperluan untuk menghantar ke batal* dan membenarkan penggunaan penuding biasa kepada jenis fungsi.

Fungsi Kemas Kini

Berikut ialah versi penulisan semula fungsi call_int_menggunakan penyelesaian yang dicadangkan:

<code class="cpp">template <class T>
int call_int_function(lua_State *L) {
    void (*method)(T*, int, int) = reinterpret_cast<void (*)(T*, int, int)>(lua_touserdata(L, lua_upvalueindex(1)));
    T *obj = reinterpret_cast<T *>(lua_touserdata(L, 1));

    method(obj, lua_tointeger(L, 2), lua_tointeger(L, 3));
    return 0;
}</code>

Kesimpulan

Dengan membungkus fungsi ahli dalam fungsi biasa, keperluan untuk menghantar kepada batal* dihapuskan, menyelesaikan ralat kompilasi yang dihadapi dalam GCC 4.4. Pendekatan ini mengekalkan kefungsian yang dimaksudkan sambil mematuhi had dan keperluan pemutus penunjuk kepada ahli.

Atas ialah kandungan terperinci Bagaimana untuk Menghantar Antara kekosongan* dan Penunjuk ke Fungsi Ahli 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