Puoi chiamare le funzioni Ada dal C ++?
-
05-07-2019 - |
Domanda
Sono un principiante di Ada, anche se ho usato Pascal per 2-3 anni durante HS.
IIRC, è possibile chiamare funzioni compilate Pascal da C / C ++. È possibile chiamare procedure & amp; funzioni scritte in Ada dal C ++?
Soluzione
Secondo questo vecchio tutorial , dovrebbe essere possibile.
Tuttavia, come illustrato da questa discussione , devi fare attenzione con il c ++ extern & C; quot " definizioni delle funzioni Ada.
Altri suggerimenti
Ecco un esempio usando g ++ / gnatmake 5.3.0:
NOTA: fai attenzione quando passi i dati tra 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;
}
References:
Questo genere di cose viene fatto continuamente. Il trucco è dire ad entrambe le parti di usare un protocollo di chiamata in stile "C" per la routine. In C ++ questo viene fatto con "C" esterno dichiarazioni e nella parte Ada con pragma Export (" C " ;, ...
Cerca quelli nelle tue rispettive fonti di riferimento preferite per i dettagli. Fai attenzione ai parametri puntatore e riferimento!
Assolutamente possibile. Negli ultimi cinque anni ho lavorato su un sistema che mescola C ++ e Ada.
Sì. Diversi anni fa ho scritto una breve demo semplice per dimostrarlo. C'erano due DLL, una scritta in C ++ e l'altra in Ada. Hanno appena aggiunto costanti ai valori in virgola mobile. Due app, una in C ++ e una in Ada, utilizzavano entrambe la DLL. Quindi esisteva ogni possibile combinazione di chiamata / chiamata C ++ da Ada. Tutto ha funzionato bene. Questo era su Windows qualunque versione fosse attuale al momento; Non ricordo, ma potrebbe aver funzionato su Linux o BeOS.
Ora, se solo potessi trovare il codice sorgente da quello ...