Especificações de ligação
O termo "especificação de vinculação" se refere ao protocolo para funções de vinculação (ou procedimentos) escritas em diferentes linguagens. As seguintes convenções de chamada são afetadas:
Diferenciação de maiúsculas e minúsculas em nomes.
Decoração de nomes. Em C, o compilador coloca um sublinhado como prefixo de nomes. Isso geralmente é chamado de “decoração”. No C++, a decoração de nome é usada para reter as informações de tipo durante a fase de vinculação. (Consulte Nomes decorados)
A ordem na qual os argumentos são esperados na pilha.
Responsabilidade de ajuste da pilha no retorno da função. A função chamada ou a função de chamada é responsável.
Passagem dos argumentos ocultos (se qualquer argumento oculto for passado).
extern string-literal { declaration-list }
extern string-literal declaration
A especificação de vinculação facilita gradativamente a movimentação do código de C para C++ permitindo o uso de código existente.
Específico da Microsoft
As únicas especificações de vinculação suportadas no momento pelo Microsoft C++ são "C" e "C++".
FIM de Específico da Microsoft
O exemplo a seguir declara as funções atoi e atol com esse tipo de vinculação de C:
extern "C"
{
int atoi( char *string );
long atol( char *string );
}
As chamadas para essas funções são feitas usando o vínculo de C. O mesmo resultado pode ser obtido com essas duas declarações:
extern "C" int atoi( char *string );
extern "C" long atol( char *string );
Específico da Microsoft
Qualquer padrão do Microsoft C inclui políticas de compilação condicional de uso de arquivos para detectar a compilação de C++. Quando a compilação de C++ for detectada, os protótipos serão incluídos em uma política extern "C" dessa forma:
// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif
// Function declarations
#if defined(__cplusplus)
}
#endif
FIM de Específico da Microsoft
Você não precisa declarar as funções nos arquivos de inclusão padrão como extern "C".
Se uma função for sobrecarregada, não mais que uma das funções com o mesmo nome poderá ter um especificador de vinculação. (Para obter mais informações, consulte Sobrecarga de funções.)
A tabela a seguir mostra como as várias especificações de vinculação funcionam.
Efeitos das especificações de vinculação
Especificação |
Efeito |
---|---|
Em um objeto |
Afeta o vínculo apenas desse objeto |
Em uma função |
Afeta o vínculo dessa função e de todas as funções ou objetos declarados nela |
Em uma classe |
Afeta o vínculo de todas as funções que não são membros e objetos declarados nessa classe |
Se uma função tiver mais de uma especificação de vinculação, elas devem concordar; é errado declarar funções como tendo o vínculos de C e C++. Além disso, se duas declarações para uma função ocorrem em um programa — uma com uma especificação de vinculação e a outra sem — a declaração com a especificação de vinculação deve ser a primeira. Todas as declarações redundantes de funções que já têm a especificação de vinculação são atribuídas a uma vinculação especificada na primeira declaração. 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 declarados explicitamente como static dentro do corpo de um especificador composto de vinculação ({ }) são tratados como funções estáticas ou objetos; o especificador de vinculação é ignorado. Funções e outros objetos se comportam como se declarados usando a palavra-chave extern. (Consulte Uso da palavra-chave Extern para especificar a vinculação para obter detalhes sobre a palavra-chave extern.)