Si es posible, entonces sus clases se derivan de una estructura. A continuación, puede utilizar punteros a esta estructura en el código C:
// C++ code
extern "C" struct Cfoo {};
extern "C" struct Cbar {};
class foo : public Cfoo {};
class bar : public Cbar {};
// C API
extern "C" {
struct Cfoo;
struct Cbar;
}
No es estrictamente un error, sin embargo gcc, al menos, advierte sobre la conversión entre los punteros con diferentes tipos.
void foo (void) {
struct Cfoo * pf;
struct Cbar * pb;
pf = pb; // gcc warns
}
Si no puede heredar, a continuación, utilizar una idea similar, pero tienen la tienda de estructura C un puntero al objeto de C++, y de nuevo sólo declarar adelante las estructuras de la API C:
// C++ code
class foo {};
class bar {};
extern "C" struct Cfoo { foo * pFoo; };
extern "C" struct Cbar { bar * pBar; };
// C API
extern "C" {
struct Cfoo;
struct Cbar;
}
El La desventaja aquí es que la vida útil del objeto Cfoo y Cbar debe ser atendida.
¿Puedo preguntar qué tiene esto que ver con Lisp? – Svante
Es una parte de una cuestión más general de exponer clases de C++ a Common Lisp a través de CFFI (o FFI dependiente de la implementación de lisp). –