À l'aide de la bibliothèque C++ dans le code C
J'ai une bibliothèque C++ qui fournit des différentes classes pour la gestion des données. J'ai le code source de la bibliothèque.
Je veux prolonger la durée de l'API C++ pour support C-les appels de fonction, de sorte que la bibliothèque peut être utilisé avec du code C et C++ code en même temps.
Je suis à l'aide de chaîne d'outils GNU (gcc, glibc, etc), de sorte que la langue et l'architecture de soutien ne sont pas un problème.
Existe-il des raisons pour lesquelles c'est techniquement pas possible?
Sont là tout gotcha que j'ai besoin de regarder dehors pour?
Sont là des ressources, des exemples de code et/ou de la documentation disponible au sujet de cette?
Quelques autres choses que j'ai trouvé:
- Utilisez la commande suivante pour envelopper votre C++ en-têtes qui doivent être utilisés par du code C.
#ifdef __cplusplus
extern "C" {
#endif
//
//Code goes here ...
//
#ifdef __cplusplus
} //extern "C"
#endif
- Garder "réel" C++ interfaces de séparer les fichiers d'en-tête qui ne sont pas inclus par C. Pense PIMPL principe ici. À l'aide de
#ifndef __cplusplus #error
aide stuff ici afin de détecter toute folie. - Prudent de C++ les identificateurs de noms dans le code C
- Les énumérations dont la taille varie entre compilateurs C et C++. Probablement pas un problème si vous utilisez GNU outil de la chaîne, mais encore, être prudent.
-
Pour les structures de suivre le formulaire suivant afin que C ne pas confondre.
typedef struct X { ... } X
-
Puis utiliser des pointeurs pour passer autour des objets en C++, il suffit juste d'être déclarée en C comme struct X où X est l'objet C++.
Tout cela, c'est grâce à un ami qui est un assistant au C++.
- Un peu en retard, mais j'ai écrit un petit howto sur le C wrapper C++: teddy.ch/c++_library_in_c
Vous devez vous connecter pour publier un commentaire.
Oui, c'est certainement possible. Vous aurez besoin d'écrire une couche d'interface en C++, qui déclare fonctions avec
extern "C"
:Ensuite, vous allez appeler
foo()
de votre module C, qui se charge de transmettre l'appel à l'realFoo()
fonction est implémentée en C++.Si vous avez besoin d'exposer un plein de classe C++ avec les membres de données et de méthodes, alors vous pouvez avoir besoin de faire plus de travail que ce simple exemple de la fonction.
extern "C"
être placés que dans des déclarations (et pas dans les définitions)? Parce que vous avez mentionné "la couche qui déclare les fonctions" mais votre exemple de code est également une définition. En d'autres termes, doit-on le placer dans l'en-tête des fichiers ou des fichiers sources?(ou les deux?)extern "C"
là. Votre compilateur va vous dire si vous avez également à mettre sur la définition.C++ FAQ Lite: "Comment mixer code C et C++".
Certains pièges sont décrites dans les réponses à ces questions:
Principal gotcha: les exceptions ne peuvent pas être pris en C. Si il y a la possibilité d'une exception à la hausse dans le code C++, soit écrire votre code en C ou C++ wrappers très soigneusement. À l'inverse, d'exception comme des mécanismes (c'est à dire, longjump) dans le code C (que l'on trouve dans différents langages de script) ne sont pas requis pour appeler les destructeurs pour les objets C++ sur la pile.
vous pouvez mélanger du code C/C++. Si votre fonction main() en C++, alors vous devez vous assurer que votre c fonctions sont déclarées
Si votre main est C, alors vous êtes probablement OK sauf pour les variables statiques. Tous les constructeurs avec vos variables statiques sont censés être appelé avant main() démarrer. Cela ne se produira pas si C est votre principal. Je vous avez beaucoup de variables statiques, la meilleure chose à faire est de remplacer les variables statiques et les singletons.