Heim > Backend-Entwicklung > C++ > Hauptteil

Wie kann man in C zwischen void* und einem Zeiger auf eine Memberfunktion umwandeln?

Mary-Kate Olsen
Freigeben: 2024-10-29 07:18:02
Original
1035 Leute haben es durchsucht

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

Umwandlungsschwierigkeiten zwischen void* und einem Zeiger auf eine Mitgliedsfunktion

Bei der Arbeit mit C-Bibliotheken stoßen Entwickler häufig auf Herausforderungen beim Umwandeln zwischen void* und einem Zeiger auf eine Mitgliedsfunktion . Ziel dieses Artikels ist es, ein spezifisches Problem im Zusammenhang mit diesem Thema anzugehen und eine praktikable Lösung bereitzustellen.

Problemstellung

In einem Versuch, die Bindung von C-Objekten an einen Lua-Interpreter zu erleichtern, wurde eine Funktion, call_int_function wurde mit GCC 4.4 entwickelt. Allerdings löste die Zeile reinterpret_cast)(int, int)>(lua_touserdata(L, lua_upvalueindex(1))) einen Kompilierungsfehler aus, der auf eine ungültige Umwandlung von void in einen Zeiger hinweist zur Mitgliedsfunktion.

Fehlerursache

GCC betrachtet die Umwandlung von void in void (T::)(int, int) als ungültig, da es sich um Zeiger auf Mitglieder handelt unterscheiden sich von regulären Zeigern. Es handelt sich nicht um Adressen im herkömmlichen Sinne, und ihre Implementierung unterscheidet sich erheblich von Compiler zu Compiler.

Alternative Lösung

Die Lösung für dieses Problem besteht darin, die Mitgliedsfunktion in eine reguläre Funktion einzubinden. Die freie Funktion sollte das Objekt als erstes Argument verwenden. Dieser Ansatz macht eine Umwandlung in void* überflüssig und ermöglicht die Verwendung eines regulären Zeigers auf den Funktionstyp.

Aktualisierte Funktion

Hier ist eine neu geschriebene Version der call_int_function unter Verwendung der vorgeschlagenen Lösung:

<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>
Nach dem Login kopieren

Fazit

Durch das Einschließen der Mitgliedsfunktion in eine reguläre Funktion entfällt die Notwendigkeit einer Umwandlung in void*, wodurch der in GCC 4.4 aufgetretene Kompilierungsfehler behoben wird. Dieser Ansatz behält die beabsichtigte Funktionalität bei und beachtet gleichzeitig die Einschränkungen und Anforderungen des Pointer-to-Member-Castings.

Das obige ist der detaillierte Inhalt vonWie kann man in C zwischen void* und einem Zeiger auf eine Memberfunktion umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage