C ++ Linkage Idiomas diferentes de C?

25

A linguagem C ++ permite a mistura de C ++ e C em um arquivo de origem. Por exemplo,

extern "C" {
    struct bar { /* ... */ }
}

O C ++ ou já suportou outras "linguagens de ligação" que não o C? por exemplo extern "Pascal"ouextern "Haskell"

dkaranovich
fonte
na maioria das vezes ambas as línguas farão o extern "C"equivalente a interagir uns com os outros
aberração catraca
Suportes C ++ outra ligação, permitindo imlementations para adicionar seus tipos de ligação (§7.5), a questão deve ser "existem Do implementações ou ter implementtions existia" ;-)
Johannes
2
extern "C"afeta apenas a ligação, não a sintaxe e a semântica do texto dentro do bloco. Em outras palavras, ainda é C ++ dentro desse extern "C"bloco; os nomes dos símbolos não são mutilados. Veja stackoverflow.com/q/1041866/712605
Richard Hansen

Respostas:

17

extern "C" pode ser o único necessário:

Toda implementação deve fornecer vinculação às funções escritas na linguagem de programação C, "C", e vinculação às funções C ++, "C ++".

No entanto, outros podem existir conforme esta citação:

O literal da cadeia indica a ligação de idioma necessária. Este Padrão Internacional especifica a semântica para os literais de cadeia "C" e "C ++". O uso de uma cadeia de caracteres literal que não seja "C" ou "C ++" é suportado condicionalmente, com semântica definida pela implementação. [Nota: Portanto, uma especificação de ligação com uma string literal que é desconhecida para a implementação requer um diagnóstico. - nota final] [Nota: Recomenda-se que a ortografia da string literal seja retirada do documento que define esse idioma. Por exemplo, Ada (não ADA) e Fortran ou FORTRAN, dependendo do vintage. - nota final]

aaronman
fonte
1
De onde isso é citado?
paul
@paul c ++ 11 rascunho padrão
aaronman
9

Em muitos ambientes (a maioria), "extern" C "é a convenção de vinculação padrão para qualquer idioma no sistema.

Portanto, dependendo do sistema operacional e da implementação da linguagem "estrangeira" "extern C" é tudo o que você precisa para chamar um programa em outra linguagem compilada.

James Anderson
fonte
Ambientes Mesmo não usando C ligação (Pascal ou seja, muitas vezes usa outra ordem argumento na pilha e o receptor tem de libertar o valor) que têm um modo de C-compatível
Johannes
@johannes: Na verdade, o Windows usa a convenção Pascal para muitas coisas, mas como ele também precisa em C e C não possui a extern "Language"sintaxe " ", eles fazem isso através da extensão C específica da plataforma, portanto, para C ++, ainda é justo extern "C"e o especial A palavra-chave especifica a convenção de chamada diferente.
Jan Hudec
1
Ainda pode haver casos em que um fornecedor do compilador adiciona tipos de ligação especiais. Além da interoperabilidade com outras linguagens, isso também pode ser interessante para a interoperabilidade com nomes diferentes de C ++. A pergunta é se alguém fez :)
Johannes
-4
  • Não! O C ++ suporta apenas C como "linguagens de ligação".

  • extern "C" {barra de estrutura {/ * ... * /}}

  • A sintaxe como acima significa que não altera o nome da variável, estrutura ou função. Como o C ++ talvez altere o nome da variável, estrutura ou função para implementar Classe, Espaço para Nome e sobrecarga de função.

  • Se você não fizer isso, o vinculador talvez não consiga descobrir o objeto da variável, estrutura da função.

  • C ++ foi projetado para ser compatível com C. O "C" externo é a maneira de implementar compatível com C.

Edward Shen
fonte
10
Por favor, verifique §7.5 do padrão C ++. extern "C"e extern "C++"são os únicos obrigatórios, mas as implementações podem fornecer outros.
Johannes