Avrai bisogno di "avvolgere" l'interfaccia C++ con funzioni regolari C che prendono un parametro per indicare quale oggetto che Sarò chiamato. Ad esempio, se si hanno in C++
class A
{
// .. boilerplate stuff...
int SomeMethod(int n, float f);
};
Poi insieme ad esso, si potrebbe dichiarare una funzione come
extern "C" int A_SomeMethod(void* Obj, int n, float f)
{
return(((A*)Obj)->SomeMethod(n, f));
}
Se non stai bene con il getto del vuoto *, è possibile implementare un tipo di mappa da un handle opaco a uno A*
. Ma l'essenza è che dovrete mantenere un po 'di handle/puntatore all'oggetto sul quale verrà chiamato il metodo. Al fine di ottenere il puntatore/maniglia è necessario avvolgere l'assegnazione di: file
extern "C" void* A_Instantiate()
{
return new A;
}
C++ devono essere compilate separatamente insieme con il file con le funzioni di cui sopra. Un allegato separato per la compilazione C dovrebbe includere le dichiarazioni di tutte le funzioni di cui sopra.
MODIFICA: le avvertenze e i commenti riportati di seguito sono importanti; per rispondere alla domanda, "Sì, è possibile chiamare C++ da C", e questo è un approccio. Non è un approccio completo in quanto non esiste un modo meccanicistico per farlo, ma è un inizio. Inoltre, non dimenticare di creare un altro call-through per delete
, ecc, ecc
Grazie a wilsonmichaelpatrick, ma che ne è dell'utilizzo del codice * Compiled * C++ nel mio programma C ?! – S0H31L
Che cosa è 'A' che viene usato per lanciare' Obj' ?! È un tipo o struttura predefinito ?! – S0H31L
'A' è il tipo di classe C++. Anche con codice C++ compilato, questo approccio dovrebbe funzionare. Tutto quello che devi fare è definire i metodi extern "C" lungo le linee che ho descritto sopra, e usarli per chiamare il tuo codice C++. Il codice C++ stesso non deve essere modificato. – wilsonmichaelpatrick