2011-02-12 4 views
10

J'ai besoin d'écrire une bibliothèque en C++, utilisable par le client pour effectuer certaines opérations sur un serveur distant. La seule chose dans le spécifique que je n'ai pas encore fait c'est: La bibliothèque C++ a besoin d'une interface C. Permettez-moi d'expliquer mieux: De client utilisant cette lib je dois faire quelque chose comme: int opération (void * addr); si int < 0 erreur et ainsi de suite .. Mais la bibliothèque c'est une classe en C++. Donc, ma réponse est .. Besoin d'une variable globale contenant l'instance de classe dans la bibliothèque? Les sont une meilleure option pour développer cette interface C de classe C++?Bibliothèque C++ avec interface c

Thx dans le conseil pour la réponse.

+4

La réponse clé est déjà là. N'oubliez pas d'externer C "{}' vos déclarations d'interface. –

+2

http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html – Flexo

+1

Pour un exemple concret, consultez la bibliothèque 0MQ, http://www.zeromq.org: écrit en C++ avec une interface C (et une interface C++ enroulée autour de cela). –

Répondre

16

Vous pouvez utiliser le PIMPL idiom dans l'encapsuleur C. Vous fournissez une méthode YourClass_Create qui appelle le constructeur en interne (en utilisant new) et renvoie le pointeur vers votre instance de classe; pour le code client ce sera juste un handle opaque (il peut être un typedef pour void *), à passer à chaque fonction de votre interface C pour spécifier sur quelle instance il doit fonctionner (tout comme FILE * en stdio).

Toutes ces fonctions devront faire est d'appeler la méthode correspondante sur le handle (converti en un pointeur vers votre classe) et traduire les exceptions aux codes d'erreur.


Comme @ JDV-Jan de Vaan a souligné dans son commentaire, ne pas oublier le nécessaire #ifdef ed extern "C" {} autour de votre code wrapper C, sinon vous pouvez obtenir des erreurs de liaison.