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 de nombres.
decoración de nombres.En C, los nombres de los prefijos del compilador con un subrayado.Esto se suele denominar “decoración.” En C++, la decoración de nombres se utiliza para conservar la información de tipo con la fase de vinculación.(Vea Nombres representativos)
Orden en el que los argumentos son esperados 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.
El paso de argumentos ocultos (si algunos argumentos ocultos se pasan).
extern string-literal { declaration-list }
extern string-literal declaration
La especificación de vinculación facilita gradualmente el trasladar el código de C a C++ permite el uso de código existente.
Específicos de Microsoft
Las únicas especificaciones de vinculación compatibles actualmente por Microsoft C++ son “C” y “C++”.
Específico de Microsoft de FINAL
El ejemplo siguiente declara 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 hace mediante vinculación c.El mismo resultado se puede 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++., prototipos se agregan en una directiva de extern “c” como sigue:
// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif
// Function declarations
#if defined(__cplusplus)
}
#endif
Específico de Microsoft de FINAL
No necesita 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 La sobrecarga de la función.)
La tabla siguiente se muestra cómo funcionan las diferentes especificaciones de vinculación.
efectos de las especificaciones de Linkage
especificación |
Efecto |
---|---|
en un objeto |
Afecta al acoplamiento de ese objeto sólo |
en una función |
Afecta al acoplamiento de esa función y todas las funciones u objetos declarados dentro de |
en una clase |
Afecta al acoplamiento de todas las funciones y objetos de 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 para declarar funciones como si tuvieran vinculación de C y C++.Además, si dos declaraciones para una función aparecen en un programa (una con una especificación de vinculación y otro sin — la declaración con la especificación de vinculación debe ser primera.Cualquier declaración redundante de funciones que ya tienen especificación de vinculación se proporciona vinculación especificado 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.
Funciones y objetos explícitamente declarados mientras Estática dentro del cuerpo de un especificador compuesto de vinculación () se trata como funciones u objetos estáticos; se omite el especificador de vinculación.Otras funciones y objetos se comportan como si estuvieran declaradas mediante la palabra clave de extern .(Vea Mediante extern para especificar Linkage para obtener más información sobre la palabra clave de extern .)