Especificações de ligação
O termo "especificação de vinculação" refere-se ao protocolo para vinculação de funções (ou procedimentos) escritos em linguagens diferentes.As seguintes convenções de chamada são afetadas:
Maiúsculas/minúsculas dos nomes.
Decoração de nomes.Em C, o compilador prefixos de nomes com um sublinhado.Isso é chamado "decoração". No C++, decoração de nome é usada para manter informações de tipo pela fase de ligação.(Consulte decorado nomes)
Ordem na qual os argumentos são esperados na pilha.
Responsabilidade para ajustar a pilha na função de retorno.Tanto a função chamada como função de chamada é responsável.
Passando argumentos ocultos (se nenhum argumento oculto é passado).
extern string-literal { declaration-list }
extern string-literal declaration
Facilita a especificação de vinculação gradualmente portar o código C, C++, permitindo o uso de código existente.
Específicos do Microsoft
As especificações de ligação única atualmente suportadas pelo Microsoft C++ são "C" e "C++".
Específicos do Microsoft final
O exemplo a seguir declara as funções atoi e atol com ligação C:
extern "C"
{
int atoi( char *string );
long atol( char *string );
}
Chamadas para essas funções são feitas usando a ligação C.O mesmo resultado poderia ser atingido com duas declarações:
extern "C" int atoi( char *string );
extern "C" long atol( char *string );
Específicos do Microsoft
Todos os Microsoft C padrão incluem diretivas de compilação condicional de uso de arquivos para detectar a compilação do C++.Quando é detectada uma compilação de C++, protótipos são colocados entre um extern "C" diretiva da seguinte maneira:
// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif
// Function declarations
#if defined(__cplusplus)
}
#endif
Específicos do Microsoft final
Você não precisa declarar as funções em que os arquivos de inclusão padrão como extern "C".
Se uma função estiver sobrecarregada, não mais do que uma das funções de mesmo nome pode ter um especificador de ligação.(Para obter mais informações, consulte A sobrecarga de função.)
A tabela a seguir mostra como várias especificações de ligação de trabalho.
Efeitos de especificações de ligação
Especificação |
Efeito |
---|---|
Em um objeto |
Ligação afeta somente desse objeto |
Em uma função |
Ligação afeta dessa função e todas as funções ou objetos declarados dentro dela |
Em uma classe |
Afeta a ligação de todas as funções não-membro e objetos declarados dentro da classe |
Se uma função tiver mais de uma especificação de vinculação, eles devem concordar; ele é um erro declarar funções como tendo a ligação de c e C++.Além disso, se as duas declarações para uma função ocorrerem em um programa — uma com uma especificação de vinculação e sem — a declaração com a especificação de ligação deve ser primeira.Todas as declarações de funções que já possuem a especificação de vinculação redundantes recebem o vínculo especificado na declaração da primeira.Por exemplo:
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.
Funções e objetos explicitamente declaradas como estático dentro do corpo de um especificador de ligação compostos ({}) são tratados como funções estáticas ou objetos; o especificador de ligação é ignorado.Outras funções e objetos que se comportam como se a declarado usando a extern palavra-chave.(Consulte usando extern para especificar ligação para obter detalhes sobre o extern palavra-chave.)