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

Mary-Kate Olsen
Lepaskan: 2024-10-29 07:18:02
asal
1034 orang telah melayarinya

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>
Salin selepas log masuk

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!

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