Si c'est possible, alors vos classes dérivent d'une structure. Vous pouvez ensuite utiliser des pointeurs vers cette structure dans le code 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;
}
Ce n'est pas strictement une erreur, mais au moins gcc met en garde contre la conversion entre les pointeurs avec différents types.
void foo (void) {
struct Cfoo * pf;
struct Cbar * pb;
pf = pb; // gcc warns
}
Si vous ne pouvez pas hériter, utilisez une idée similaire, mais ont la structure C magasin un pointeur sur l'objet du C, et encore simplement déclarer avant les structures dans l'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;
}
Le inconvénient ici est que la durée de vie de l'objet Cfoo et Cbar doit être pris en charge.
Puis-je vous demander ce que cela a à voir avec Lisp? – Svante
Cela fait partie d'une question plus générale d'exposer les classes C++ à Common Lisp par CFFI (ou FFI dépendant de l'implémentation Lisp). –