2010-08-27 16 views
14

¿Cómo podemos llamar "C++" funciones miembro de clase en código 'C" "C"?Calling "C++" función miembro de la clase de código

Tengo dos archivos .cpp, en la que he definido algunas clases con funciones miembro y los correspondientes archivos ".h" que ha incluido algunos otros que ayudan a los archivos cpp/h.

Ahora quiero llamar a estos funcionalidad de archivos CPP en el archivo "C". ¿Cómo puedo hacerlo?

Respuesta

34

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.

+0

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

+0

@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

+0

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

Cuestiones relacionadas