extern "C" determina cómo deben nombrarse los símbolos en el archivo de objeto generado. Si se declara una función sin extern "C", el nombre del símbolo en el archivo del objeto usará el cambio de nombre de C++. Aquí hay un ejemplo.
TEST.C Dada esta manera:
void foo() { }
Compilar y una lista de símbolos en el archivo de objeto da:
$ g++ -c test.C
$ nm test.o
0000000000000000 T _Z3foov
U __gxx_personality_v0
La función foo se llama en realidad "_Z3foov". Esta cadena contiene información de tipo para el tipo de retorno y los parámetros, entre otras cosas. Si en lugar de escribir TEST.C así:
extern "C" {
void foo() { }
}
a continuación, compilar y mirar a los símbolos:
$ g++ -c test.C
$ nm test.o
U __gxx_personality_v0
0000000000000000 T foo
Usted recibe C vinculación. El nombre de la función "foo" en el archivo de objeto es solo "foo", y no tiene toda la información de tipo elegante que proviene del cambio de nombre.
Generalmente, se incluye un encabezado dentro de la opción "C" {} si el código que lo acompaña se compiló con un compilador de C pero está intentando llamarlo desde C++. Cuando haces esto, le estás diciendo al compilador que todas las declaraciones en el encabezado usarán el enlace C. Cuando vincula su código, sus archivos .o contendrán referencias a "foo", no a "_Z3fooblah", lo que con suerte coincidirá con lo que esté en la biblioteca con la que está enlazando.
La mayoría de las bibliotecas modernas colocarán protecciones alrededor de tales encabezados para que los símbolos se declaren con el enlace correcto. p.ej. en muchas de las cabeceras estándar encontrará:
#ifdef __cplusplus
extern "C" {
#endif
... declarations ...
#ifdef __cplusplus
}
#endif
Esto asegura que cuando código C++ incluye la cabecera, los símbolos en su partido fichero objeto del contenido de la biblioteca C. Solo debe colocar extern "C" {} alrededor de su encabezado C si es antiguo y ya no tiene estas protecciones.
Estoy confundido con lo que quieres decir en el título de tu pregunta ... ¿puedes dar más detalles? –
No estoy seguro de qué otra manera ponerlo. ¿Has leído más allá del título? – Landon