2011-10-07 16 views
13

Me gustaría usar Pure Data como una herramienta de creación de prototipos para mi propia biblioteca. Descubrí que los parches de Pure Data están escritos en C, pero mi biblioteca está escrita en C++. Entonces, ¿cómo puedo usar este código en datos puros? Como no he utilizado el C simple, me gustaría saber cómo podría escribir un C wrapper para las clases de C++ y, entonces, ¿cómo crear una instancia de mis clases? ¿O tengo que volver a escribir todo en C?Envolvedora C para C++

+5

Un poco tarde, pero escribí un pequeño tutorial sobre C wrapper para C++: http://www.teddy.ch/c++library_in_c/ – Teddy

Respuesta

21

Usted tendrá que escribir funciones de contenedor para cada función que tiene que ser llamado por ejemplo:!.

// 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 debe ser código C++. El extern "C" especifica que la función usa las convenciones de nomenclatura C.

+6

En lugar de usar 'void *', debe usar una estructura incompleta para obtener algún tipo de seguridad. –

+1

Para ayudar a comprender mejor, 'extern "Linkage_Specification" {// code} 'De esta manera, uno le dice al compilador la especificación de vinculación que debe usar al vincular el código. –

+0

No estoy seguro de entender completamente su ejemplo. Si declaro esas funciones "C" externas en mi encabezado C++, ¿por qué tengo que declararlas nuevamente en C? ¿No puedo simplemente incluir el encabezado C++ en mi archivo C y llamar las funciones directamente? – Pedro

1

Puede absolutamente llamar a C desde C++ - ¡no hay problema!

En el peor de los casos, es posible que tenga que declarar explícitamente aquellas funciones que llama desde Pure Data como "extern C". Pero es casi seguro que Pure Data ha hecho ya que para usted (probablemente verá "C extern" en los archivos de cabecera Pure Data

Aquí hay más información:.

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

'esperanza de que ayuda

+0

Creo que desde la Q el OP quiere llamar a C++ desde C, no el revés. –

+0

Me gustaría usarlo de otra manera: llamar a C++ desde c. – Pedro

+0

Pero presumiblemente Pure Data, sea lo que sea, solo conoce C. –

2

Permítanme decirlo de otra manera:

1) Puede llamar a funciones C, datos y bibliotecas de código fuente en C++ y te llamo C++ fuente de C.

2) Siempre C pone en C++ fuente Sin embargo, esa fuente debe escribirse en un subconjunto C de C++.

3) Parte de esto es usar "extern C".

4) Otra parte está utilizando "#ifdef __cplusplus"

5) Los enlaces I citados anteriormente dan un montón de detalles

6) Miré el Pure Data site. Es posible que deba hacer algunos "ajustes" a su biblioteca. Es posible que desee crear un nuevo encabezado. Pero fundamentalmente, creo que probablemente pueda lograr su objetivo de lograr que su biblioteca se integre con Pure Data.

mi humilde opinión ...

2

También puede escribir objetos para Pure Data usando C++ utilizando el flext framework.