2011-02-12 25 views
10

necesito escribir una biblioteca en C++, utilizable por el cliente para realizar algunas operaciones en un servidor remoto. Lo único específico que aún no he hecho es: la biblioteca C++ necesita una interfaz C. Déjame explicarte mejor: Desde el cliente que usa esta lib necesito llamar algo como: operación int (void * addr); if int < 0 error y así ... Pero la biblioteca es una clase en C++. Entonces mi respuesta es ... ¿Necesito una variable global que contenga la instancia de clase en la biblioteca? ¿Hay alguna mejor opción para desarrollar esta interfaz C de la clase C++?biblioteca C++ con interfaz c

Thx en consejos de respuesta.

+4

La respuesta clave ya está abajo. No olvides extern "C" {} 'tus declaraciones de interfaz. –

+2

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

+1

Para obtener un ejemplo de la vida real, consulte la biblioteca 0MQ, http://www.zeromq.org: escrito en C++ con una interfaz C (y una interfaz C++ alrededor de eso). –

Respuesta

16

Puede usar el PIMPL idiom en el envoltorio en C. Proporciona un método YourClass_Create que internamente llama al constructor (utilizando new) y devuelve el puntero a su instancia de clase; para el código del cliente esto será solo un identificador opaco (puede ser typedef para void *), que se pasará a cada función de su interfaz C para especificar en qué instancia debe funcionar (al igual que FILE * en).

Todas estas funciones tendrán que hacer es llamar al método correspondiente en el controlador (convertido de nuevo a un puntero a su clase) y traducir las excepciones a los códigos de error.


Como @ jdv-Jan de Vaan señaló en su comentario, no se olvide la necesaria #ifdef ed extern "C" {} alrededor de su código C envoltura, de lo contrario puede obtener errores de enlace.