97 votes

Utiliser la bibliothèque C ++ en 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 à cela est techniquement pas possible?

Y a - gotcha que j'ai besoin de regarder dehors pour?

Existe-il des ressources, des exemples de code et/ou documents disponibles sur ce?

Merci

Mise à JOUR :

Quelques autres choses que j'ai trouvé:

  1. 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 ici ...
    //
    #ifdef __cplusplus
    } // extern "C"
    #endif

  2. Garder le "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.

  3. Attention C++ identificateurs de noms dans le code C
  4. 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.
  5. Pour les structures de suivre le formulaire suivant afin que C ne pas confondre.

    typedef struct X { ... } X

  6. Ensuite, 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 est grâce à un ami qui est un assistant au C++.

67voto

Greg Hewgill Points 356191

Oui, c'est certainement possible. Vous devrez écrire une couche d'interface en C ++ qui déclare les fonctions avec extern "C" :

 extern "C" int foo(char *bar)
{
    return realFoo(std::string(bar));
}
 

Ensuite, vous appelerez foo() depuis votre module C, qui transmettra l'appel à la fonction realFoo() 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.

22voto

Alex B Points 34304

FAQ C ++ Lite: "Comment mélanger du code C et C ++" .

Quelques pièges sont décrits dans les réponses à ces questions:

  • [32.8] Comment puis-je passer un objet d'une classe C ++ vers / depuis une fonction C?
  • [32.9] Ma fonction C peut-elle accéder directement aux données d'un objet d'une classe C ++?

11voto

ejgottl Points 2178

Obtenu principal: les exceptions ne peuvent pas être interceptées en C. S'il est possible qu'une exception se produise dans le code C ++, écrivez très attentivement votre code C ou vos wrappers C ++. Inversement, les mécanismes tels que les mécanismes (par exemple, longjump) du code C (utilisés dans divers langages de script) ne sont pas nécessaires pour appeler des destructeurs pour les objets C ++ de la pile.

3voto

David Nehme Points 11564

vous pouvez mélanger du code C / C ++. Si votre main () fonctionne 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 supposés être appelés avant le démarrage de main (). Cela n'arrivera pas si C est votre principale. Si vous avez beaucoup de variables statiques, la meilleure chose à faire est de remplacer les variables statiques par des singletons.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X