Especificaciones de vinculación
El término "especificación de vinculación" hace referencia al protocolo para vincular funciones (o procedimientos) escritos en lenguajes diferentes. Las convenciones de llamada siguientes se ven afectadas:
Distinción entre mayúsculas y minúsculas en nombres.
Nombres representativos. En C, el compilador prefija los nombres con un carácter de subrayado. Esto se suele denominar "nombres representativos". En C++, los nombres representativos se utilizan para conservar información de tipo durante la fase de vinculación. (Vea Nombres representativos)
Orden en el que se esperan los argumentos en la pila.
Responsabilidad de ajustar la pila al volver de la función. La función llamada o la función de llamada es responsable.
Paso de argumentos ocultos (si se pasa algún argumento oculto).
extern string-literal { declaration-list }
extern string-literal declaration
La especificación de vinculación facilita la migración gradual de código C a C++ permitiendo el uso de código existente.
Específicos de Microsoft
Las únicas especificaciones de vinculación compatibles actualmente con Microsoft C++ son "C" y "C++".
FIN de Específicos de Microsoft
En el ejemplo siguiente se declaran las funciones atoi y atol con vinculación C:
extern "C"
{
int atoi( char *string );
long atol( char *string );
}
Las llamadas a estas funciones se hacen usando vinculación C. El mismo resultado se podría lograr con estas dos declaraciones:
extern "C" int atoi( char *string );
extern "C" long atol( char *string );
Específicos de Microsoft
Todos los archivos de inclusión estándar de Microsoft C utilizan directivas de compilación condicional para detectar la compilación de C++. Cuando se detecta la compilación de C++, los prototipos se incluyen en una directiva extern "C" de la manera siguiente:
// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif
// Function declarations
#if defined(__cplusplus)
}
#endif
FIN de Específicos de Microsoft
No es necesario declarar las funciones en los archivos de inclusión estándar como extern "C".
Si una función está sobrecargada, no más de una de las funciones del mismo nombre puede tener un especificador de vinculación. (Para obtener más información, vea Sobrecarga de funciones).
En la tabla siguiente se muestra cómo funcionan diversas especificaciones de vinculación.
Efectos de las especificaciones de vinculación
Especificación |
Efecto |
---|---|
En un objeto |
Afecta solo a la vinculación de ese objeto |
En una función |
Afecta a la vinculación de esa función y de todas las funciones u objetos declarados dentro de ella |
En una clase |
Afecta a la vinculación de todos los objetos y funciones no miembro declarados dentro de la clase |
Si una función tiene más de una especificación de vinculación, deben coincidir; es un error declarar funciones que tengan tanto vinculación de C como de C++. Además, si en un programa aparecen dos declaraciones para una función (una con una especificación de vinculación y otra sin ella), la declaración con especificación de vinculación debe ser la primera. Cualquier declaración redundante de funciones que ya tengan especificación de vinculación recibe la vinculación especificada en la primera declaración. Por ejemplo:
extern "C" int CFunc1();
...
int CFunc1(); // Redeclaration is benign; C linkage is
// retained.
int CFunc2();
...
extern "C" int CFunc2(); // Error: not the first declaration of
// CFunc2; cannot contain linkage
// specifier.
Las funciones y objetos declarados explícitamente como static dentro del cuerpo de un especificador de vinculación compuesto ({ }) se tratan como funciones u objetos estáticos; el especificador de vinculación se omite. Otras funciones y objetos se comportan como si se hubieran declarado mediante la palabra clave extern. (Vea Uso de extern para especificar vinculación para obtener más información sobre la palabra clave extern).