Verwenden einer C-Klassenmitgliedsfunktion als C-Rückruffunktion
Bei der Interaktion mit C-Bibliotheken aus C-Code ist es notwendig, Rückrufe einzurichten . In diesem Artikel werden die Herausforderungen untersucht, die beim Versuch auftreten, eine Mitgliedsfunktion der C-Klasse als Rückruf für eine C-Funktion mit einer bestimmten Signatur zu registrieren, int a(int , int ).
Das Haupthindernis Es wurde festgestellt, dass nicht-statische Memberfunktionen einen impliziten ersten Parameter vom Typ Klasse A* besitzen, der den Zeiger this darstellt. Diese Nichtübereinstimmung der Parametersignatur zwischen der erwarteten Rückruffunktion und der bereitgestellten Memberfunktion der C-Klasse führt zu einem Kompilierungsfehler.
Lösung:
Um dieses Problem zu beheben, muss das Member Funktion muss als statisch deklariert werden. Dadurch wird der implizite erste Parameter eliminiert, sodass die Mitgliedsfunktion der C-Klasse als Rückruf registriert werden kann.
Alternativer Ansatz:
Wenn der Rückrufregistrierungsmechanismus dies zulässt, eine Alternative Der Ansatz besteht darin, eine Wrapper-Funktion zu erstellen. Diese Wrapper-Funktion kann eine reguläre C-Funktion sein, die die Argumente an die gewünschte C-Klassenmitgliedsfunktion weiterleitet. Durch die Registrierung der Wrapper-Funktion als Rückruf kann die Klassenmitgliedsfunktion indirekt über den Proxy aufgerufen werden.
Beispiel:
Betrachten Sie den Beispielcode unten:
class A { public: A(); ~A(); int e(int *k, int *j); private: static int e_c(int *k, int *j) { A* this_ptr = reinterpret_cast<A*>(callback_user_data); return this_ptr->e(k, j); } }; A::A() { register_with_library(e_c) }
Im obigen Code ist die Funktion e_c() eine statische Wrapper-Funktion, die das Argument callback_user_data in ein umwandelt Ein*-Zeiger, der den Zugriff auf diesen Zeiger und den anschließenden Aufruf der e()-Mitgliedsfunktion ermöglicht. Dieser Ansatz ermöglicht die indirekte Registrierung der C-Klassen-Memberfunktion als Callback, auch wenn sie nicht mit der genauen Signatur der Callback-Funktion übereinstimmt.
Das obige ist der detaillierte Inhalt vonWie kann ich eine Member-Funktion der C-Klasse als C-Callback verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!