2011-10-07 14 views
13

Mi piacerebbe utilizzare Pure Data come strumento di prototipazione per la mia libreria. Ho scoperto che le patch di Pure Data sono scritte in C, ma la mia libreria è scritta in C++. Quindi, come posso utilizzare questo codice in puro dati? Dato che non ho usato C semplice, mi piacerebbe sapere come scrivere un wrapper C per le classi C++ e come creare istanze delle mie classi? O devo riscrivere tutto in C?C Wrapper per C++

+5

Un po 'tardi, ma ho scritto un piccolo howto su C wrapper per C++: http://www.teddy.ch/c++_library_in_c/ – Teddy

risposta

21

avrete bisogno di scrivere funzioni wrapper per ogni funzione che deve essere chiamato, ad esempio:!.

// The C++ implementation 
class SomeObj { void func(int); }; 

extern "C" { 
    SomeObj* newSomeObj() {return new SomeObj();} 
    void freeSomeObj(SomeObj* obj) {delete obj;} 
    void SomeObj_func(SomeObj* obj, int param) {obj->func(param)} 
} 

// The C interface 
typedef struct SomeObjHandle SomeObj; 

SomeObj* newSomeObj(); 
void freeSomeObj(SomeObj* obj); 
void SomeObj_func(SomeObj* obj, int param); 

Nota Thi s deve essere il codice C++. Lo standard extern "C" specifica che la funzione utilizza le convenzioni di denominazione C.

+6

Invece di usare 'void *' dovresti usare una struttura incompleta per ottenere un po 'di sicurezza. –

+1

Per aiutare a capire meglio, extern "Linkage_Specification" {// code} 'In questo modo si dice al compilatore le specifiche del Linkage da usare durante il collegamento del codice. –

+0

Non sono sicuro di aver compreso il tuo esempio in modo completo. Se dichiaro quelle funzioni "C" extern nell'intestazione C++, perché devo dichiararlo di nuovo in C? Non posso semplicemente includere l'intestazione C++ nel mio file C e chiamare direttamente le funzioni? – Pedro

1

Si può assolutamente chiamare C da C++ - no problemo!

Nel peggiore dei casi, potrebbe essere necessario dichiarare esplicitamente le funzioni chiamate da Pure Data come "extern C". Ma è quasi certo che Pure Data ha già fatto per voi (probabilmente vedrete "extern C" nei file Pure intestazione dati

Ecco maggiori informazioni:.

http://msdn.microsoft.com/en-us/library/0603949d%28v=vs.80%29.aspx

'speranza che aiuta

+0

Penso che dalla Q l'OP voglia chiamare C++ da C, non il viceversa. –

+0

Mi piacerebbe usarlo nell'altro modo: chiamare C++ da c. – Pedro

+0

Ma presumibilmente Pure Data, qualunque esso sia, sa solo di C. –

2

Mettiamola in un altro modo:

1) È possibile chiamare funzioni C, i dati e le librerie dalla sorgente C++, e vi invito C++ fonte da C.

2) Ogni volta che C mette in C fonte ++ tuttavia, quella fonte deve essere scritta in un sottoinsieme C di C++.

3) Parte di questo utilizza "extern C".

4) Un'altra parte sta usando "#ifdef __cplusplus"

5) I collegamenti ho citato sopra dare un sacco di dettagli

6) Ho guardato il Pure Data site. Potrebbe essere necessario apportare alcune "modifiche" al tuo grimorio. Potresti voler creare una nuova intestazione. Fondamentalmente, penso che probabilmente riuscirai a raggiungere il tuo obiettivo di integrare la tua libreria con Pure Data.

IMHO ...

2

È possibile anche scrivere oggetti per Pure Data utilizzando C++ utilizzando il flext framework.