Uso de la biblioteca C++ en código C


Tengo una biblioteca de 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 funciones de 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 lenguaje y arquitectura no es un problema.

¿Hay alguna razón por la que esto es técnicamente no es posible?

¿Hay alguna gotcha s que tengo que tener cuidado?

¿Hay recursos, código de ejemplo y/o documentación disponible con respecto a esto?


Algunas otras cosas que he descubierto:

  1. Use lo siguiente para envolver sus encabezados de C++ que necesitan ser utilizados por el código de C.

#ifdef __cplusplus
extern "C" {  
#endif  
//  
// Code goes here ...  
//  
#ifdef __cplusplus  
} // extern "C"  
#endif
  1. Mantenga interfaces C++ "reales" en archivos de encabezado separados que no están incluidos por C. Piense Principio PIMPL aquí. El uso de #ifndef __cplusplus #error cosas ayuda aquí a detecta cualquier locura.
  2. Cuidado con los identificadores C++ como nombres en código C
  3. Enumeraciones que varían en tamaño entre compiladores de C y C++. Probablemente no sea un problema si está utilizando GNU tool chain, pero aún así, tenga cuidado.
  4. Para las estructuras siga la siguiente forma para que C no se confunda.

    typedef struct X { ... } X
    
  5. Luego use punteros para pasar objetos de C++, solo tienen que ser declarados en C como estructura X donde X es el objeto de C++.

Todo esto es cortesía de un amigo que es un mago en C++.

 90
Author: Misha M, 2008-10-14

4 answers

Sí, esto es ciertamente posible. Necesitará escribir una capa de interfaz en C++ que declare 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 está implementada en C++.

Si necesita exponer una clase completa de C++ con miembros de datos y métodos, entonces es posible que necesite hacer más trabajo que este simple ejemplo de función.

 63
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-13 23:33:49

C++ FAQ Lite: "Cómo mezclar código C y C++".

Algunas trampas 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 de un objeto de una clase C++?
 20
Author: Alex B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-29 07:29:49

Gotcha principal: las excepciones no se pueden capturar en C. Si existe la posibilidad de que surja una excepción en el código de C++, escriba su código de C o sus envoltorios de C++ con mucho cuidado. Por el contrario, los mecanismos de excepción (es decir, longjump) 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.

 11
Author: ejgottl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-13 23:45:31

Puede mezclar código C/C++. Si tu función main() está en C++, entonces solo necesitas asegurarte de que tus funciones de c están declaradas

extern "C"

Si su principal es C, entonces probablemente esté bien, excepto por las variables estáticas. Se supone que cualquier constructor con sus variables estáticas debe ser llamado antes del inicio de main (). Esto no sucederá si C es su principal. Si tienes muchas variables estáticas, lo mejor que puedes hacer es reemplazar variables estáticas con singletones.

 3
Author: David Nehme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-13 23:40:34