Utilisation d'une fonction membre de classe C comme fonction de rappel C
Lors de l'interaction avec des bibliothèques C à partir du code C, il devient nécessaire d'établir des rappels . Cet article explore les défis rencontrés lors de la tentative d'enregistrement d'une fonction membre de classe C en tant que rappel pour une fonction C avec une signature spécifique, int a(int , int ).
Le principal obstacle rencontré est que les fonctions membres non statiques possèdent un premier paramètre implicite de classe de type A*, représentant le pointeur this. Cette inadéquation dans la signature des paramètres entre la fonction de rappel attendue et la fonction membre de la classe C fournie entraîne une erreur de compilation.
Solution :
Pour surmonter ce problème, le membre la fonction doit être déclarée statique. Cela élimine le premier paramètre implicite, permettant à la fonction membre de la classe C d'être enregistrée en tant que rappel.
Approche alternative :
Si le mécanisme d'enregistrement du rappel le permet, une alternative L’approche consiste à créer une fonction wrapper. Cette fonction wrapper peut être une fonction C normale qui transmet les arguments à la fonction membre de la classe C souhaitée. En enregistrant la fonction wrapper comme rappel, la fonction membre de la classe peut être invoquée indirectement via le proxy.
Exemple :
Considérez l'exemple de code ci-dessous :
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) }
Dans le code ci-dessus, la fonction e_c() est une fonction wrapper statique qui convertit l'argument callback_user_data en un Un pointeur*, permettant l'accès au pointeur this et l'invocation ultérieure de la fonction membre e(). Cette approche permet à la fonction membre de la classe C d'être indirectement enregistrée en tant que rappel, même si elle ne correspond pas à la signature exacte de la fonction de rappel.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!