Estoy trabajando en un proyecto que tiene mucho código C heredado . Comenzamos a escribir en C ++, con la intención de convertir también el código heredado. Estoy un poco confundido acerca de cómo interactúan C y C ++. Entiendo que al envolver el código C con extern "C"
el compilador de C ++ no alterará los nombres del código C , pero no estoy completamente seguro de cómo implementar esto.
Entonces, en la parte superior de cada archivo de encabezado C (después de incluir guardias), tenemos
#ifdef __cplusplus
extern "C" {
#endif
y abajo escribimos
#ifdef __cplusplus
}
#endif
Entre los dos, tenemos todos nuestros incluye, typedefs, y prototipos de funciones. Tengo algunas preguntas para ver si entiendo esto correctamente:
Si tengo un archivo C ++ A.hh que incluye un archivo de encabezado C Bh, incluye otro archivo de encabezado C Ch, ¿cómo funciona? Creo que cuando el compilador ingrese a Bh,
__cplusplus
se definirá, por lo que envolverá el código conextern "C"
(y__cplusplus
no se definirá dentro de este bloque). Entonces, cuando entra en Ch,__cplusplus
no se definirá y el código no se envolveráextern "C"
. ¿Es esto correcto?¿Hay algo malo en envolver un fragmento de código
extern "C" { extern "C" { .. } }
? ¿Qué hará el segundoextern "C"
?No colocamos este contenedor alrededor de los archivos .c, solo los archivos .h. Entonces, ¿qué sucede si una función no tiene un prototipo? ¿El compilador piensa que es una función de C ++?
También estamos usando un código de terceros que está escrito en C y no tiene este tipo de envoltorio. Cada vez que incluyo un encabezado de esa biblioteca, pongo un
extern "C"
alrededor del #include. ¿Es esta la forma correcta de lidiar con eso?Finalmente, ¿es esto una buena idea? ¿Hay algo más que debamos hacer? Vamos a mezclar C y C ++ en el futuro previsible, y quiero asegurarme de que cubrimos todas nuestras bases.