Compartilhar via


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

Consulte também

Referência

Usando extern para especificar ligação