¿Qué pasa si está escribiendo un programa en C++ y quiere usar una librería de C? Si hace uso de la declaración de funciones de C,
float f(int a, char b);
el compilador de C++ adornará el nombre como algo tipo
_f_int_char
para permitir la sobrecarga de la
función (y el enlazado con verificación de tipos). De todas
formas, el compilador de C que compiló su librería C
definitivamente no decoró ese nombre, por lo que su nombre
interno será _f
. Así pues, el enlazador no
será capaz de resolver sus llamadas tipo C++ a
f()
.
La forma de resolver esto que se propone en C++ es la
especificación de enlazado alternativo, que
se produjo en el lenguaje sobrecargando la palabra clave
extern
. A la palabra clave extern
le sigue una
cadena que especifica el enlazado deseado para la declaración,
seguido por la declaración:
extern "C" float f(int a, char b);
Esto le dice al compilador que f()
tiene
enlazado tipo C, de forma que el compilador no decora el
nombre. Las dos únicas especificaciones de enlazado soportadas
por el estándar son «C» y «C++», pero algunos vendedores ofrecen
compiladores que también soportan otros lenguajes.
Si tiene un grupo de declaraciones con enlazado alternativo, póngalas entre llaves, como a continuación:
extern "C" { float f(int a, char b); double d(int a, char b); }
O, para archivos de cabecera,
extern "C" { #include "Myheader.h" }
La mayoría de compiladores disponibles de C++ manejan las especificaciones de enlazado alternativo dentro de sus propios archivos de cabecera que trabajan tanto con C como con C++, por lo que no tiene que preocuparse de eso.