você pode chamar funções Ada de C ++?
-
05-07-2019 - |
Pergunta
Eu sou um novato completo Ada, embora eu usei Pascal por 2-3 anos durante HS.
IIRC, é possível chamar funções compiladas Pascal de C / C ++. É possível chamar procedimentos e funções escritas em Ada de C ++?
Solução
De acordo com esta velho tutorial , deve ser possível.
No entanto, como ilustrado por esta discussão , você deve ter cuidado com as c ++ extern "C definições de suas funções ada".
Outras dicas
Aqui está um exemplo usando g ++ / gnatmake 5.3.0:
NOTA: Tenha cuidado ao passar dados entre C ++ e Ada
ada_pkg.ads
package Ada_Pkg is
procedure DoSomething (Number : in Integer);
pragma Export (C, DoSomething, "doSomething");
end Ada_Pkg;
ada_pkg.adb
with Ada.Text_Io;
package body Ada_Pkg is
procedure DoSomething (Number : in Integer) is
begin
Ada.Text_Io.Put_Line ("Ada: RECEIVED " & Integer'Image(Number));
end DoSomething;
begin
null;
end Ada_Pkg;
main.cpp
/*
TO BUILD:
gnatmake -c ada_pkg
g++ -c main.cpp
gnatbind -n ada_pkg
gnatlink ada_pkg -o main --LINK=g++ -lstdc++ main.o
*/
#include <iostream>
extern "C" {
void doSomething (int data);
void adainit ();
void adafinal ();
}
int main () {
adainit(); // Required for Ada
doSomething(44);
adafinal(); // Required for Ada
std::cout << "in C++" << std::endl;
return 0;
}
Referências:
Esse tipo de coisa é feito o tempo todo. O truque é contar ambos os lados para usar um protocolo chamado de estilo "C" para a rotina. Em C ++ isso é feito com extern declarações "C", e no lado de Ada com pragma Exportação ( "C", ...
Olhe aqueles em suas respectivas fontes de referência favorito para mais detalhes. Cuidado com ponteiro e referência paramters!
Absolutamente é possível. Nos últimos cinco anos, tenho vindo a trabalhar em um sistema que mistura C ++ e Ada.
Sim. Vários anos atrás eu escrevi um curto simples demonstração para provar isso. Havia dois DLLs, uma escrita em C ++ e o outro em Ada. Eles só adicionado constantes para valores de ponto flutuante. Duas aplicações, uma em C ++ e um em Ada, cada um, utilizados tanto a DLL. Assim, todas as combinações possíveis de C ++ chamando / chamada de Ada existiu. Tudo funcionou bem. Este foi no Windows qualquer versão era atual no momento; Não me lembro, mas pode ter começado este trabalho no Linux ou BeOS.
Agora, se eu pudesse encontrar o código-fonte do que ...