C no tiene la noción thiscall
. La convención de llamadas C no permite llamar directamente a C++ o funciones miembro de bject.
Por lo tanto, debe proporcionar una API contenedora alrededor de su objeto C++, una que tome el puntero this
explícitamente, en lugar de implícitamente.
Ejemplo:
// C.hpp
// uses C++ calling convention
class C {
public:
bool foo(int arg);
};
C envoltorio API:
// 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
Su API sería implementado 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);
}
Hay un montón de gran documentación por ahí, también . El primero I bumped into se puede encontrar here.
Gracias xtofl, Incluso yo estaba pensando que tenemos que escribir funciones de contenedor, pero tengo algunas dudas: 1. ¿Cómo tratamos, si la clase se hereda de algunas otras clases, qué necesitamos para envolturas la clase de padres también funciona 2. O tenemos que escribir envoltorios para las funciones que estamos llamando en el archivo "C" solamente .... – Priyanshu
@Priyanshu: un giro interesante. C no conoce las funciones virtuales, pero sí su código API. Entonces, si 'D' anulara la función (virtual)' foo', todo lo que necesitaría adicional es un 'D_Create' en su API. Al igual que el patrón de fábrica, diría. Pero quizás necesite proporcionar información más concreta. – xtofl
Gracias xtofl, Solo una cosa más, usted ha dado el ejemplo anterior .... clase C { public: bool foo (int arg); }; si tenemos algo como clase C { pública: bool foo (int arg, X * x); privado: X * x; } }; Entonces, ¿cómo podemos escribir wrapper para eso ... es posible :-( – Priyanshu