2009-03-04 8 views
3

Können Sie C++ Funktionen von Ada aufrufen?Können Sie C++ Funktionen von Ada aufrufen?

Ich frage mich, ob es eine Möglichkeit gibt, dies direkt zu tun, ohne die Implementierung in C und Schreiben eines C++ - Wrapper & und Ada Wrapper, z. Ich würde gerne C++ -> Ada statt C++ -> c -> Ada gehen.

+0

Es gibt mehr als ein Betriebssystem auf der Welt. Es gibt mehr als eine C++ - Implementierung. Es gibt mehr als eine Ada-Implementierung. Was Sie fragen, ist keine Sprachdefinition, sondern eine Implementierung. Sie müssen mehr Details angeben. –

+0

Ich bin verwirrt. Die Frage beginnt damit, dass du Ada-> C++ schreiben willst, aber am Ende sagst du C++ -> Ada. Das sind sehr unterschiedliche Dinge. –

+0

Ich hätte diese Notation verdeutlichen sollen ... hier bedeutet das -> "importiert von" oder "aufgerufen von". Worauf ich hinaus wollte war, ich wollte C-Wrapper nicht in mein C++ schreiben müssen, um in Ada zu gelangen, sondern direkt. Sry, das war nicht sehr klar. – paxos1977

Antwort

4

Das Problem mit Ada C++ ist, dass C++ keinen definierten ABI hat.
Jeder Compiler darf den leistungsfähigsten ABI definieren, den er kann. So eine Schnittstelle von anderen Sprachen (Ada) ist ein Schmerz, wie Sie Ihren Ada Compiler wissen müssten, mit welchem ​​Compiler das C++ kompiliert wurde, bevor es den richtigen Code erzeugen konnte, um irgendeine C++ Methode/Funktion aufzurufen.

Auf der anderen Seite ist der C ABI als Standard für alle Compiler definiert und bietet somit eine angenehme Schnittstelle für jede Sprache, mit der man sich verbinden kann.

+1

Standard C, wie die meisten Sprachen, definiert keine ABI. Der C ABI ist ziemlich "Ihre CPU und OS Assembly ABI"; nur auf x86 haben Sie mindestens vier verschiedene Prozedur-Aufrufkonventionen (Stdcall, Cdecl, Thiscall, Fastcall, ...) –

+0

Michael Ratanapintha: Der C-Standard definiert eine ABI. Es definiert, wie Parameter an Funktionen angepasst werden. Wo die Absenderadresse gespeichert ist und wo das Ergebnis eines Funktionsaufrufs gefunden werden kann. Die gleiche Konvention wird für alle Compiler verwendet. –

+0

@Martin: Äh, was? –

1

Es scheint nicht möglich ...

Informationen vom here

"Direkte Schnittstelle zu C++ von Ada außerhalb des Anwendungsbereichs des Ada ist (mindestens 95)"

+0

Das bedeutet nur, dass es keinen * Standard * Weg gibt es zu tun, nicht dass es unmöglich ist. –

0

Green Hills Software hat dazu auch ein tolles PDF veröffentlicht.
http://www.ghs.com/download/whitepapers/ada_c++.pdf

+0

Fehler ... Nr. Green Hills verwendet GCC nicht. Sie haben ihren eigenen Compiler, von dem ich glaube, dass er das Itermetrics (jetzt SofCheck?) Frontend verwendet. Allerdings ist ein Großteil der Informationen in diesem PDF tatsächlich compilerunabhängig. Ada gibt eine Menge davon im Standard an. –

1

I Ada nicht berührt haben 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 missionskritische) tun und die Art und Weise, wie wir die beiden inkorporierten, bestand darin, den C++ - Code in einer DLL zu haben und dann einen C-Wrapper für diese DLL zu erstellen und dann eine Pragma-Schnittstelle zu verwenden, die den c-Wrapper spezifizierte und dann die Methoden innerhalb der DLL aufrufen konnte diese Schnittstelle.

Ich denke, es dauerte einige dreifache Wartung, weil die Methodensignaturen in der Pragma-Schnittstelle und der C-Wrapper aktualisiert werden mussten, wenn sie in der C++ - DLL geändert wurden.

Im Grunde war es ein Schmerz. Ich denke, wir mussten eine Win32 Lean und Mean Precomplier-Direktive im C-Wrapper verwenden.

Wie auch immer, das sind alle drei von uns, die an dem Projekt gearbeitet haben, können sich erinnern.

+1

Sie müssen das nur in Windows tun, wenn Sie gcc zum Kompilieren einer Seite und VisualC++ zum Kompilieren der anderen Seite verwenden. Selbst der C/C++ - Compiler von gcc würde dieses Problem haben. Der Grund dafür ist, dass gcc und Microsoft verschiedene Linker verwenden. Wenn Sie einen Ada-Compiler verwenden, der den Microsoft-Linker verwendet (wie ObjectAda), haben Sie dieses Problem nicht. Wenn Sie Windows nicht verwenden, haben Sie dieses Problem auch nicht. :-) –

4

Die einzige wirklich compiler-agnostische Antwort, die ich Ihnen geben kann, ist, dass es genauso möglich ist, C++ von C auf Ihrem System aufzurufen.

Ähnlich wie bei C, müssen Sie herausfinden, Ihre C++ - Routine Name-Mangled-Symbol und schreiben Sie eine Bindung auf der C (in diesem Fall die Ada) -Seite, die auf diesen verstümmelten Namen verlinkt. Sie werden wahrscheinlich auch einige Dinge auf der C++ Seite tun müssen, wie die C++ Funktion extern zu deklarieren.

Wenn Sie Ihre C++ Funktion extern "C" deklarieren können, ist es einfach. Tun Sie das einfach auf C++ - Seite und verwenden Sie Adas Standard-C-Import-Funktionen auf der Ada-Seite.

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); 
2

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

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

Auch neueste Version von GNAT verfügen über einen leistungsstarken automatischen Bindungsgenerator.

+0

Ihre URL ist nicht korrekt. Es sollte http://www.adacore.com/uploads/technical-papers/Class_level_interfacing.pdf sein. – qunying

+0

Auch für gcc und gnat, http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Interfacing-with-C_002b_002b- at-the-Class-Level.html – qunying