J'ai une bibliothèque C++ qui fournit différentes classes pour gérer les données. J'ai le code source de la bibliothèque.
Je souhaite étendre l'API C++ pour prendre en charge les appels de fonction C afin que la bibliothèque puisse être utilisée avec du code C et du code C++ en même temps.
J'utilise GNU (gcc, glibc, etc.), donc la prise en charge du langage et de l'architecture n'est pas un problème.
Y a-t-il des raisons pour lesquelles cela techniquement n'est pas possible?
Existe-t-il des gotcha's que je dois surveiller?
Existe-t-il des ressources, des exemples de code et/ou de la documentation à ce sujet?
Quelques autres choses que j'ai découvertes:
#ifdef __cplusplus
extern "C" {
#endif
//
// Code goes here ...
//
#ifdef __cplusplus
} // extern "C"
#endif
#ifndef __cplusplus #error
stuff aide ici à détecter toute folie.Pour les structures, suivez le formulaire suivant afin que C ne soit pas confondu.
typedef struct X { ... } X
Ensuite, utilisez des pointeurs pour faire circuler les objets C++, ils doivent simplement être déclarés en C comme struct X où X est l'objet C++.
Tout cela est gracieuseté d'un ami qui est un assistant de C++.
Oui, c'est certainement possible. Vous devrez écrire une couche d'interface en C++ qui déclare des fonctions avec extern "C"
:
extern "C" int foo(char *bar)
{
return realFoo(std::string(bar));
}
Ensuite, vous appellerez foo()
depuis votre module C, qui passera l'appel à la fonction realFoo()
qui est implémentée en C++.
Si vous devez exposer une classe C++ complète avec des membres de données et des méthodes, vous devrez peut-être faire plus de travail que cet exemple de fonction simple.
C++ FAQ Lite: "Comment mélanger le code C et C++" .
Certains pièges sont décrits dans les réponses à ces questions:
Gotcha principal: les exceptions ne peuvent pas être interceptées en C. S'il y a la possibilité d'une exception dans le code C++, écrivez votre code C ou vos wrappers C++ très soigneusement. Inversement, les mécanismes de type exception (c'est-à-dire, longjump) dans le code C (comme on le trouve dans divers langages de script) ne sont pas requis pour appeler des destructeurs pour les objets C++ sur la pile.
vous pouvez mélanger du code C/C++. Si votre fonction main () en C++, il vous suffit de vous assurer que vos fonctions c sont déclarées
extern "C"
Si votre principal est C, alors vous êtes probablement OK sauf pour les variables statiques. Tous les constructeurs avec vos variables statiques sont censés être appelés avant le démarrage de main (). Cela ne se produira pas si C est votre principal. Si vous avez beaucoup de variables statiques, la meilleure chose à faire est de remplacer les variables statiques par des singletons.