Domanda

Puoi chiamare le funzioni C ++ da Ada?

Mi chiedo se c'è un modo per farlo direttamente, senza fare l'implementazione in C e scrivere un wrapper C ++ & amp; e wrapper Ada, ad es. Vorrei andare in c ++ - > Ada piuttosto che c ++ - > c - > Ada.

È stato utile?

Soluzione

Il problema con Ada a C ++ è che C ++ NON ha un ABI definito.
A ciascun compilatore è consentito definire l'ABI più efficace possibile.

Quindi l'interfacciare da altre lingue (Ada) è una seccatura poiché avresti bisogno del tuo compilatore Ada per sapere con quale compilatore è stato compilato il C ++ prima che potesse generare il codice corretto per chiamare qualsiasi metodo / funzione C ++.

D'altra parte l'ABI C è ben definito uno standard per tutti i compilatori e come tale fornisce un'interfaccia comoda e conveniente per qualsiasi lingua con cui connettersi.

Altri suggerimenti

L'unica risposta davvero indipendente dal compilatore che posso darti è che è altrettanto possibile come chiamare C ++ da C sul tuo sistema.

In modo molto simile a C, devi capire il simbolo con il nome alterato della routine C ++ e scrivere un'associazione sul lato C (in questo caso l'Ada) che si collega a quel nome modificato. Probabilmente dovrai anche fare alcune cose sul lato C ++, come dichiarare la funzione C ++ esternamente.

Se puoi dichiarare la tua funzione C ++ esternamente " C " ;, è facile. Fallo sul lato C ++ e usa le funzionalità di importazione C standard di Ada sul lato Ada.

Esempio:

nel tuo cpp:

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

nel tuo .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);

Potresti essere interessato a questo documento, che discute un'associazione a livello di oggetto di Ada al C ++:

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

Inoltre, la versione recente di GNAT presenta un potente generatore di rilegatura automatica.

Non sembra possibile ...

Informazioni da qui

" L'interfaccia diretta a C ++ da Ada non rientra nell'ambito di Ada (almeno 95) "

swig potrebbe essere in grado di farlo

Non ho toccato Ada dal 99/00, quindi la mia memoria potrebbe essere un po 'imprecisa, ma quando stavamo lavorando su un'app grafica di Windows in Ada dovevamo fare alcune cose in C ++ (non mission-critical) e il modo in cui incorporato i due era quello di avere la roba c ++ in una dll (s) e quindi creare un wrapper C per quella DLL e quindi utilizzare un'interfaccia pragma che specificava il wrapper c e quindi potremmo chiamare i metodi all'interno della dll da tale interfaccia.

Penso che questo abbia comportato una tripla manutenzione perché le firme del metodo dovevano essere aggiornate nell'interfaccia pragma e nel wrapper C se fossero cambiate nella DLL c ++.

Fondamentalmente è stato un dolore. Penso che abbiamo dovuto usare una direttiva precomponente Lean e Mean Win32 nel wrapper C.

Ad ogni modo, possiamo ricordare tutti e tre coloro che hanno lavorato al progetto.

Green Hills Software ha pubblicato anche un ottimo PDF su questo.
http://www.ghs.com/download/whitepapers/ada_c++.pdf

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top