Nombre Mangling y «C» externo en C++

C++ admite la sobrecarga de funciones, es decir, puede haber más de una función con el mismo nombre pero con diferentes parámetros. ¿Cómo distingue el compilador de C++ entre diferentes funciones cuando genera código objeto ? Cambia los nombres agregando información sobre los argumentos. Esta técnica de agregar información adicional a los nombres de las funciones se llama Name Mangling . El estándar C++ no especifica ninguna técnica en particular para la manipulación de nombres, por lo que diferentes compiladores pueden agregar información diferente a los nombres de las funciones. 

Considere el siguiente ejemplo de Name Mangling, que tiene varias declaraciones de la función f(): 

CPP

// Function overloading in CPP to demonstrate
// Name Mangling
 
int f(void) { return 1; }
 
int f(int) { return 0; }
 
void g(void) { int i = f(), j = f(0); }

Algunos compiladores de C++ pueden cambiar los nombres anteriores por los siguientes,  

CPP

// Function overloading to demonstrate
// Name Mangling
 
int __f_v(void) { return 1; }
 
int __f_i(int) { return 0; }
 
void __g_v(void) { int i = __f_v(), j = __f_i(0); }

Nota: C no admite la sobrecarga de funciones, por lo tanto, cuando vinculamos un código C en C++, debemos asegurarnos de que el nombre de un símbolo no cambie.

¿Cómo manejar los símbolos C al vincular desde C++? 

En C, los nombres no pueden alterarse ya que no admite la sobrecarga de funciones. Entonces, ¿cómo asegurarnos de que el nombre de un símbolo no cambie cuando vinculamos un código C en C++? Por ejemplo, vea el siguiente programa C++ que usa la función printf() de C. 
 

C++

// C Program to demonstrate it
// doesn't support Name Mangling
 
int printf(const char* format, ...);
 
// Driver Code
int main()
{
    printf("GeeksforGeeks");
    return 0;
}

El programa anterior genera un error.

Error del compilador:

En la función `main’:
f84cc4ebaf5b87bb8c6b97bc54245486.cpp:(.text+0xf): referencia indefinida a `printf(char const*, …)’
collect2: error: ld devolvió 1 estado de salida

Explicación: el motivo del error del compilador es simple, el compilador de C++ cambia el nombre de printf() y no encuentra la definición de la función con un nuevo nombre.

Solución: Externa “C” en C++

Cuando se coloca algún código en el bloque «C» externo, el compilador de C++ se asegura de que los nombres de las funciones no se modifiquen, que el compilador emite un archivo binario con sus nombres sin cambios, como lo haría un compilador de C.
Si cambiamos el programa anterior al siguiente, el programa funciona bien e imprime «GeeksforGeeks» en la consola (como se muestra a continuación).
 

C++14

// CPP Program to demonstrate Extern "C"
 
extern "C" {
int printf(const char* format, ...);
}
 
// Driver Code
int main()
{
    printf("GeeksforGeeks");
    return 0;
}
Producción

GeeksforGeeks

Por lo tanto, todos los archivos de encabezado de estilo C (stdio.h, string.h, etc.) tienen sus declaraciones en el bloque «C» externo.

CPP

#ifdef __cplusplus
extern "C" {
#endif
// Declarations of this file
#ifdef __cplusplus
}
#endif

Los siguientes son los puntos principales discutidos anteriormente:  
1. Dado que C++ admite la sobrecarga de funciones, se debe agregar información adicional a los nombres de las funciones (llamada manipulación de nombres) para evitar conflictos en el código binario. 
2. Los nombres de las funciones no se pueden cambiar en C, ya que no admite la sobrecarga de funciones. Para evitar problemas de vinculación, C++ admite el bloque «C» externo. El compilador de C++ se asegura de que los nombres dentro del bloque «C» externo no se cambien.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *