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++ 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.