Pergunta

Você pode chamar funções C ++ de Ada?

Eu estou querendo saber se existe uma maneira de fazer isso diretamente, sem fazer a implementação em C e escrevendo um C ++ invólucro & e invólucro Ada, por exemplo, Eu gostaria de ir c ++ -> Ada em vez de c ++ -> c -.> Ada

Foi útil?

Solução

O problema com Ada para C ++ é que C ++ não tem um ABI definido.
Cada compilador é permitido para definir a ABI mais effecient ele pode.

Assim, a interface de outras línguas (ADA) é uma dor como você precisaria de seu compilador Ada saber qual compilador do C ++ foi compilado com antes que pudesse gerar o código correto para ligar para qualquer ++ método / função C.

Por outro lado, o C ABI está bem definido um padrão em todos os compiladores e como tal fornece uma interface conveniente agradável para qualquer linguagem para se conectar com.

Outras dicas

A resposta só é realmente compilador-agnóstico que lhe posso dar é que é tão possível como chamar C ++ a partir de C em seu sistema.

Muito parecido com C, você tem que descobrir o seu C ++ símbolo mutilado-nome de rotina e escrever uma vinculativa para o C (neste caso, o Ada) lado que links para que nome desconfigurado. Você também vai provavelmente ter que fazer algumas coisas no lado do C ++, como declarar a função C ++ extern.

Se você pode declarar a sua função C ++ extern "C", é fácil. Basta fazer isso no C ++ lado e usar a importação C padrão de Ada apresenta no lado de Ada.

Exemplo:

no seu CPP:

extern "C" int cpp_func (int p1, int p2) {
   ; // Whatever..
}

no seu .adb:

function cpp_func (p1, p2 : Interfaces.C.Int) return Interfaces.C.Int;
pragma Import (C, cpp_func); 

...
Result : constant Interfaces.C.Int := cpp_func (1, 2);

Você pode estar interessado neste trabalho, que discute uma ligação de Ada para C ++ objeto de nível:

http://www.adacore.com/uploads/technical-papers /Class_level_interfacing.pdf

Além disso, versão recente do GNAT possuem um gerador de ligação automática poderosa.

Não parece possível ...

Informações de aqui

"Interface direta para C ++ de Ada está fora do âmbito da ADA (pelo menos 95)"

gole pode ser capaz de fazê-lo

Eu não toquei Ada desde 99/00 por isso a minha memória pode ser um pouco modesto mas quando nós estávamos trabalhando em um aplicativo de janelas gráficas em Ada que precisávamos fazer algumas coisas em C ++ (não de missão crítica) ea maneira que nós incorporado a duas era a ter o material c ++ numa DLL (s) e, então, criar um invólucro C para que DLL e então usar uma interface pragma que especificado o invólucro C e, depois, pode chamar os métodos dentro da DLL a partir dessa interface.

Eu acho que ascenderam a cerca de manutenção triplo porque as assinaturas de método teve de ser atualizado na interface pragma e o wrapper C se eles mudaram no c ++ dll.

Basicamente, foi uma dor. Eu acho que nós tivemos que usar uma directiva precomplier magra e média Win32 no wrapper C.

De qualquer forma, isso é tudo que nós três que trabalhou no projeto pode se lembrar.

Green Hills Software publicou uma grande PDF sobre isso também.
http://www.ghs.com/download/whitepapers/ada_c++.pdf

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top