Frage

Kann rufen Sie C ++ Funktionen von Ada?

Ich frage mich, ob es eine Möglichkeit, dies direkt zu tun, ohne die Umsetzung in C zu tun und einen C ++ Wrapper & und Ada-Wrapper zu schreiben, zum Beispiel Ich möchte c gehen ++ -> Ada eher als c ++ -> c. -> Ada

War es hilfreich?

Lösung

Das Problem mit Ada C ++ ist, dass C ++ keine definierte ABI hat.
Jeder Compiler darf die meisten effecient ABI kann es definieren.

So aus anderen Sprachen Schnittstelle (Ada) ist ein Schmerz, wie Sie Ihren Ada Compiler wissen müssen, würde die Compiler die C ++ mit kompiliert wurde, bevor sie den richtigen Code generieren könnte jede C ++ Methode / Funktion aufzurufen.

Auf der anderen Seite des C ABI auch einen Standard für alle Compiler definiert ist und als solche eine schöne komfortable Schnittstelle für jede Sprache mit verbinden bieten.

Andere Tipps

Die einzige wirklich Compiler-unabhängige Antwort, die ich Ihnen geben kann, ist, dass es ebenso möglich ist C als Aufruf ++ von C auf Ihrem System.

ähnlich wie bei C, müssen Sie Ihr C ++ Routine Name-verstümmeltes Symbol herauszufinden und eine Bindung an dem C (in diesem Fall die Ada) Seite, die zu diesen verstümmelten Namen verknüpft schreiben. Sie werden auch müssen wahrscheinlich auf der Seite C ++ einige Dinge zu tun, wie die C ++ Funktion extern deklarieren.

Wenn Sie Ihre C deklarieren ++ Funktion extern „C“, es ist einfach. Nur, dass ++ Seite, auf der C tun, und Adas Standard-C-Importfunktionen auf der Ada Seite verwenden.

Beispiel:

in Ihrem cav:

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

in Ihrem .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);

Sie können in diesem Papier interessiert sein, die eine Objektebene Bindung von Ada C diskutiert ++:

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

Auch aktuelle Version von GNAT verfügt über einen leistungsstarken automatischen Bindung Generator.

Es scheint nicht möglich ...

Informationen von hier

"Direct-Schnittstelle zu C ++ von Ada ist außerhalb des Umfangs des Ada (mindestens 95)"

swig könnte in der Lage sein, es zu tun

I Ada nicht berührt habe seit 99/00 so kann mein Gedächtnis ein wenig lückenhaft sein, aber als wir auf einer grafischen Windows-Anwendung in Ada arbeiten mussten wir ein paar Sachen in C ++ (nicht geschäftskritische) und die Art und Weise tun, wir eingebaut war die beiden die c ++ Sachen in einer DLL (s) zu haben und dann ein C-Wrapper zu dieser DLL erstellen und dann eine Pragma-Schnittstelle verwenden, die die c-Wrapper angegeben und dann könnten wir die Methoden innerhalb der DLL-Datei von dieser Schnittstelle aufrufen.

Ich denke, es ist bis zu einem gewissen triple Wartung betragen, da die Methodensignaturen in der Pragma-Schnittstelle und der C-Wrapper aktualisiert werden mußten, wenn sie in dem c ++ dll geändert.

Im Grunde war es ein Schmerz. Ich denke, wir hatten eine Win32 Lean zu verwenden und precomplier Direktive in dem C-Wrapper bedeuten.

Wie auch immer, das ist alles, die drei von uns, die an dem Projekt gearbeitet erinnern kann.

Green Hills Software veröffentlicht eine große PDF über diese auch.
http://www.ghs.com/download/whitepapers/ada_c++.pdf

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top