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