Question

Pouvez-vous appeler des fonctions C ++ depuis Ada?

Je me demande s’il est possible de le faire directement, sans implémenter en C ni écrire un wrapper C ++ & amp; et Ada wrapper, par exemple Je voudrais aller c ++ - > Ada plutôt que c ++ - > c - > Ada.

Était-ce utile?

La solution

Le problème avec Ada to C ++ est que C ++ N'A PAS d'ABI défini.
Chaque compilateur est autorisé à définir l’ABI la plus efficace possible.

Il est donc difficile d’interfacer à partir d’autres langages (Ada), car vous auriez besoin de votre compilateur Ada pour savoir avec quel compilateur le C ++ a été compilé avant de pouvoir générer le code correct pour appeler une méthode / fonction C ++.

D’autre part, l’ABI C est un standard bien défini pour tous les compilateurs et, en tant que tel, constitue une interface pratique et agréable pour toutes les langues avec lesquelles se connecter.

Autres conseils

La seule réponse vraiment indépendante du compilateur que je puisse vous donner est qu’elle est aussi possible que d’appeler C ++ à partir de C sur votre système.

Comme avec C, vous devez comprendre le symbole mutilé du nom de votre routine C ++ et écrire une liaison sur le côté C (dans ce cas, le mot Ada) qui renvoie à ce nom mutilé. Vous devrez aussi probablement faire certaines choses du côté de C ++, comme déclarer la fonction C ++ extern.

Si vous pouvez déclarer votre fonction C ++ extern "C", c'est simple. Faites cela du côté C ++ et utilisez les fonctionnalités d’importation C standard d’Ada du côté Ada.

Exemple:

dans votre cpp:

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

dans votre .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);

Cet article pourrait vous intéresser. Il décrit une liaison d'Ada au niveau objet en C ++:

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

De plus, la version récente de GNAT intègre un puissant générateur de liaisons automatiques.

Cela ne semble pas possible ...

Informations provenant de ici .

"L'interface directe avec C ++ d'Ada n'entre pas dans le champ d'application d'Ada (au moins 95)"

swig pourrait peut-être le faire

Je n'ai pas touché à Ada depuis 99/00, ma mémoire est peut-être un peu floue, mais lorsque nous travaillions sur une application graphique pour fenêtres dans Ada, nous devions faire des choses en C ++ (non essentielles à la mission) et incorporé les deux devait avoir le c ++ dans une dll (s), puis créer un wrapper C pour cette DLL, puis utiliser une interface pragma qui spécifiait le wrapper c, puis nous pourrions appeler les méthodes de la dll à partir de cette interface.

Je pense que cela équivalait à une triple maintenance car les signatures de méthodes devaient être mises à jour dans l'interface pragma et dans le wrapper C si elles étaient modifiées dans la dll c ++.

En gros, c'était pénible. Je pense que nous avons dû utiliser une directive de précomplémentateur Win32 Lean and Mean dans le wrapper C.

Quoi qu'il en soit, nous nous en souvenons tous les trois. Nous avons travaillé sur le projet.

Green Hills Software a également publié un excellent PDF à ce sujet.
http://www.ghs.com/download/whitepapers/ada_c++.pdf

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top