Uso de extern C en C++

Mehvish Ashiq 12 octubre 2023
Uso de extern C en C++

Este tutorial habla sobre la manipulación de nombres en C++, el requisito previo para comprender el impacto de extern "C" en C++. Además, educa sobre extern "C" en programación C++.

Uso de extern "C" en C++

Usamos la palabra clave extern para definir variables globales, también conocidas como variables externas, y definidas fuera del método (función). Podemos usar estas variables a lo largo de un programa y modificar el valor usando funciones.

Cuando se usa la palabra clave extern en el archivo C++, un nombre de función específico en C++ tiene un enlace C. En esta situación, el compilador no modificará el nombre de la función.

¿Cuál es el nombre mangling en programación C++?

Es un requisito previo para comprender la palabra clave extern en C++. Entonces, primero aprendamos el nombre mangling.

La programación en C++ admite la función sobrecarga de funciones. Podemos tener múltiples funciones con el mismo nombre pero con diferente número de argumentos y su tipo de datos.

Aquí no se considera el tipo de dato return. La preocupación es cómo se distinguen las funciones sobrecargadas en el código objeto.

Los nombres de las funciones se cambian en el código objeto agregando detalles sobre los argumentos respectivos. La técnica utilizada aquí para agregar información de argumentos es Name Mangling.

Recuerde, no existe una técnica estandarizada en la programación de C++ para la manipulación de nombres. Esa es la razón por la que varios compiladores usan varias técnicas.

La siguiente es la demostración práctica de la manipulación de nombres en la programación C++. El siguiente código tiene tres funciones sobrecargadas llamadas calculate y un método principal.

Código de ejemplo:

int calculate(int number) { return number * number; }
double calculate(double number) { return number * number; }
float calculate(float number) { return number * number; }
int main(void) {
  int number1 = calculate(3);
  double number2 = calculate(3.38);
  float number3 = calculate(3.00);
}

El compilador de C++ cambia el código anterior para diferenciar entre funciones sobrecargadas.

Código de ejemplo:

int __calculate_i(int number) { return number * number; }
double __calculate_d(double number) { return number * number; }
float __calculate_f(float number) { return number * number; }

int __main_v(void) {
  int number1 = __calculate_i(3);
  double number2 = __calculate_d(3.38);
  float number3 = __calculate_f(3.00);
}

La programación en C no admite la sobrecarga de funciones. Por lo tanto, debemos asegurarnos de que los nombres de las funciones no cambien cuando vinculamos el código C a un archivo C++.

El fragmento de código a continuación genera un error porque el compilador cambia el nombre de la función printf() y no puede encontrar la definición de la función printf() modificada/actualizada.

Código de ejemplo:

int printf(const char *format, ...);
int main() { printf("I'm learning the use of Extern in C++"); }

Usamos la palabra clave extern en la programación de C++ para eliminar este problema. Cada vez que el compilador de C++ encuentra el código dentro del bloque extern "C" {}, se asegura de que el nombre de la función permanezca intacto.

Significa que el nombre de la función no se cambiará, lo que permitirá que el programa se ejecute correctamente. Recuerde, diferentes compiladores pueden generar diferentes salidas para estos bloques de código.

Código de ejemplo:

extern "C" {
int printf(const char *format, ...);
}
int main() { printf("I'm learning the use of Extern in C++"); }

Producción :

I'm learning the use of Extern in C++

Por lo tanto, la extern "C" es una especificación de enlace que debe estar dentro del alcance del espacio de nombres. La extern "C" ignoraría a los miembros de la clase.

Debemos usar esta palabra clave siempre que queramos vincular el código C en un archivo C++.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook