Pouvez-vous appeler les fonctions Ada à partir de C ++?
-
05-07-2019 - |
Question
Je suis un débutant dans Ada, même si j'ai utilisé Pascal pendant 2 à 3 ans au cours du SH.
IIRC, il est possible d’appeler des fonctions compilées Pascal à partir de C / C ++. Est-il possible d'appeler des procédures & amp; fonctions écrites en Ada à partir de C ++?
La solution
Selon ce ancien tutoriel , cela devrait être possible.
Cependant, comme illustré par ce fil , vous devez faire attention avec c ++ extern " C " définitions de vos fonctions Ada.
Autres conseils
Voici un exemple utilisant g ++ / gnatmake 5.3.0:
REMARQUE: soyez prudent lorsque vous transmettez des données entre C ++ et 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;
}
Références:
Ce genre de chose se fait tout le temps. L'astuce consiste à dire aux deux parties d'utiliser un protocole d'appel de style "C" pour la routine. En C ++, cela se fait avec extern "C". déclarations, et du côté Ada avec pragma Export ("C", ...
Recherchez ces informations dans vos sources de référence respectives préférées. Méfiez-vous des paramètres de pointeur et de référence!
Absolument c'est possible. Au cours des cinq dernières années, j'ai travaillé sur un système combinant C ++ et Ada.
Oui. Il y a plusieurs années, j'ai écrit une courte démonstration simple pour le prouver. Il y avait deux DLL, l'une écrite en C ++ et l'autre en Ada. Ils ont juste ajouté des constantes aux valeurs en virgule flottante. Deux applications, une en C ++ et une en Ada, utilisaient chacune la DLL. Donc, chaque combinaison possible d'appels C ++ / appelés depuis Ada existait. Tout a bien fonctionné. C'était sur Windows quelle que soit la version actuelle du moment; Je ne me souviens pas, mais cela a peut-être fonctionné sous Linux ou BeOS.
Maintenant, si seulement je pouvais trouver le code source à partir de ça ...