Puoi chiamare le funzioni C ++ da Ada?
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.
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