Umwandlung zwischen void* und einem Zeiger auf eine Mitgliedsfunktion
Bei der Arbeit mit C/C-Interoperabilität kann es beim Versuch einer Umwandlung zu Schwierigkeiten kommen zwischen einem void-Zeiger und einem Zeiger auf eine Mitgliedsfunktion. Dieses Problem tritt häufig beim Umgang mit Abschlüssen in Sprachen wie Lua auf, in denen Benutzerdaten als Void-Zeiger gespeichert werden.
Problem:
Umwandeln von void* in einen Zeiger auf a Die Memberfunktion in C ist aufgrund der grundlegenden Unterschiede in ihren Speicherdarstellungen ungültig. Zeiger auf Mitglieder enthalten zusätzliche Informationen, auf die über reguläre Zeiger nicht zugegriffen werden kann.
Lösung:
Um dieses Problem zu umgehen, ziehen Sie die folgenden Optionen in Betracht:
1. Wickeln Sie die Mitgliedsfunktion in eine freie Funktion ein:
Code-Snippet:
<code class="cpp">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>
2. Verwenden Sie ein Funktionsobjekt:
Weitere Überlegungen:
Das obige ist der detaillierte Inhalt vonWie kann man in C zwischen einem void*-Zeiger und einem Zeiger auf eine Mitgliedsfunktion umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!