Pointeur de fonction de membre statique dans les rappels de l'API C pour C : est-ce une pratique sûre et portable ?
Malgré l'apparente similitude dans la convention d'appel , l'utilisation d'un pointeur de fonction membre statique comme rappel pour les API C n'est pas considérée comme sûre ou portable selon la norme C.
Liaisons et liaisons du langage C
Section 3.5 du standard C stipule que les objets ou fonctions doivent avoir des types identiques dans toutes les déclarations qui y font référence. Cela inclut la liaison, qui détermine les conventions d'interopérabilité entre langues.
Une spécification de liaison est utilisée pour établir une liaison avec des déclarations non C, mais lorsqu'il s'agit de rappels de l'API C, la cible de rappel dans le programme C doit utiliser le même lien de langue que le code effectuant le rappel.
"C" externe pour les rappels de l'API C
La section 7.5 de la norme C précise que les types de fonctions avec différents liens linguistiques sont considérés comme des types distincts. Par conséquent, si le code de rappel utilise des liaisons en langage C, la cible de rappel en C doit également être déclarée comme extern "C".
Problèmes potentiels
Commentaires sur un sujet connexe La question Stack Overflow met en évidence les problèmes potentiels liés à l'utilisation de pointeurs de fonctions membres statiques pour les rappels de l'API C sur certaines plates-formes.
Recommandation
Pour garantir la sécurité et la portabilité, il est conseillé d'utiliser extern "C" a encapsulé les fonctions sous forme de rappels C ABI plutôt que d'utiliser directement des pointeurs de fonctions membres statiques.
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!