Usando la biblioteca C++ en el código C
gcc glibc (4)
C ++ FAQ Lite: "Cómo mezclar el código C y C ++" .
Algunos errores se describen en las respuestas a estas preguntas:
- [32.8] ¿Cómo puedo pasar un objeto de una clase C ++ a / desde una función C?
- [32.9] ¿Puede mi función C acceder directamente a los datos en un objeto de una clase de C ++?
Tengo una biblioteca C ++ que proporciona varias clases para administrar datos. Tengo el código fuente de la biblioteca.
Quiero extender la API de C ++ para admitir llamadas a función C, de modo que la biblioteca se pueda usar con código C y código C ++ al mismo tiempo.
Estoy usando la cadena de herramientas GNU (gcc, glibc, etc.), por lo que el soporte de idioma y arquitectura no es un problema.
¿Hay alguna razón por la cual esto técnicamente no es posible?
¿Hay algún problema que deba tener cuidado?
¿Hay recursos, código de ejemplo y / o documentación disponible con respecto a esto?
Algunas otras cosas que he descubierto:
- Utilice lo siguiente para envolver sus encabezados de C ++ que deben ser utilizados por el código C.
#ifdef __cplusplus
extern "C" {
#endif
//
// Code goes here ...
//
#ifdef __cplusplus
} // extern "C"
#endif
- Mantenga las interfaces de C ++ "reales" en archivos de encabezado separados que no están incluidos en C. Considere el principio de PIMPL aquí. Usar
#ifndef __cplusplus #error
cosas ayuda aquí a detectar cualquier locura. - Cuidado con los identificadores de C ++ como nombres en el código C
- Enumeraciones de tamaño variable entre los compiladores C y C ++. Probablemente no sea un problema si está utilizando la cadena de herramientas de GNU, pero aún así, tenga cuidado.
Para las estructuras, siga la siguiente forma para que C no se confunda.
typedef struct X { ... } X
Luego use punteros para pasar objetos C ++, solo tienen que declararse en C como struct X donde X es el objeto C ++.
Todo esto es cortesía de un amigo que es un asistente en C ++.
Main gotcha: las excepciones no se pueden capturar en C. Si existe la posibilidad de que una excepción aumente en el código de C ++, escriba su código C o sus contenedores de C ++ con mucho cuidado. Por el contrario, la excepción como los mecanismos (es decir, salto largo) en el código C (como se encuentra en varios lenguajes de scripting) no son necesarios para invocar destructores para objetos C ++ en la pila.
Sí, esto es ciertamente posible. Tendrá que escribir una capa de interfaz en C ++ que declara funciones con extern "C"
:
extern "C" int foo(char *bar)
{
return realFoo(std::string(bar));
}
Luego, llamará a foo()
desde su módulo C, que pasará la llamada a la función realFoo()
que se implementa en C ++.
Si necesita exponer una clase completa de C ++ con miembros y métodos de datos, entonces es posible que necesite hacer más trabajo que este simple ejemplo de función.
puedes mezclar código C / C ++. Si su función main () está en C ++, entonces solo necesita asegurarse de que sus funciones c estén declaradas
extern "C"
Si tu main es C, entonces probablemente estés bien, excepto por las variables estáticas. Se supone que todos los constructores con sus variables estáticas deben invocarse antes del inicio main (). Esto no sucederá si C es tu principal. Si tiene muchas variables estáticas, lo mejor que puede hacer es reemplazar las variables estáticas con singletons.