10.5. Especificaciones de enlazado alternativo

¿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++ decorará 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 con toda seguridad 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 reservada extern. A la palabra reservada extern le sigue una cadena que especifica el enlazado deseado para la declaración, seguida 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 los fabricantes de compiladores pueden dar soporte a otros lenguajes de la misma forma.

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 ficheros 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 ficheros de cabecera que trabajan tanto con C como con C++, por lo que no tiene que preocuparse de eso.