C n'a pas de notion thiscall
La convention d'appel C ne permet pas d'appeler directement C++ o bjecter les fonctions membres. Par conséquent, vous devez fournir une API wrapper autour de votre objet C++, qui prend explicitement le pointeur this
au lieu de l'implicitement.
Exemple:
// C.hpp
// uses C++ calling convention
class C {
public:
bool foo(int arg);
};
API wrapper C:
// api.h
// uses C calling convention
#ifdef __cplusplus
extern "C" {
#endif
void* C_Create();
void C_Destroy(void* thisC);
bool C_foo(void* thisC, int arg);
#ifdef __cplusplus
}
#endif
Votre API sera implémenté en C++:
#include "api.h"
#include "C.hpp"
void* C_Create() { return new C(); }
void C_Destroy(void* thisC) {
delete static_cast<C*>(thisC);
}
bool C_foo(void* thisC, int arg) {
return static_cast<C*>(thisC)->foo(arg);
}
Il y a beaucoup de grands documents là-bas, aussi . Le premier I bumped into peut être trouvé here.
Merci xtofl, Même je pensais que nous avons besoin d'écrire des fonctions wrapper, mais j'ai quelques doutes: 1. Comment traitons-nous, si la classe est héritée de quelques autres classes, avons-nous besoin wrappers pour fonctions de classe parent aussi. 2. OU nous avons besoin d'écrire des enveloppes à des fonctions que nous appelons dans le fichier "C" seulement .... – Priyanshu
@Priyanshu: une torsion intéressante. C ne connaît pas les fonctions virtuelles, mais votre code API. Donc, si 'D 'remplace la fonction (virtuelle)' foo', tout ce dont vous avez besoin est un 'D_Create' dans votre API. Tout comme le modèle Factory, je dirais. Mais peut-être que vous avez besoin de fournir des informations plus concrètes. – xtofl
Merci xtofl, Encore une chose, vous avez donné l'exemple ci-dessus .... classe C { public: bool foo (int arg); }; Si nous avons quelque chose comme classe C { public: bool foo (int arg, X * x); privé: X * x; } }; Alors Comment pouvons-nous écrire wrapper pour cela ... est-il possible :-( – Priyanshu