Pregunta

¿Puedes llamar a las funciones de C ++ desde Ada?

Me pregunto si hay una manera de hacer esto directamente, sin hacer la implementación en C y escribir un contenedor de C ++ & amp; y envoltorio Ada, p. Me gustaría ir a c ++ - > Ada en lugar de c ++ - > c - > Ada.

¿Fue útil?

Solución

El problema con Ada para C ++ es que C ++ NO tiene un ABI definido.
Cada compilador puede definir el ABI más eficiente que pueda.

Por lo tanto, interactuar desde otros lenguajes (Ada) es un problema, ya que necesitaría su compilador Ada para saber con qué compilador se compiló C ++ antes de que pudiera generar el código correcto para llamar a cualquier método / función C ++.

Por otro lado, el C ABI está bien definido como estándar en todos los compiladores y, como tal, proporciona una interfaz agradable y conveniente para cualquier idioma con el que conectarse.

Otros consejos

La única respuesta realmente independiente del compilador que puedo darle es que es tan posible como llamar a C ++ desde C en su sistema.

Al igual que con C, tiene que descubrir el símbolo de nombre de la rutina de C ++ y escribir un enlace en el lado C (en este caso, el Ada) que se vincula con ese nombre. Probablemente también tendrá que hacer algunas cosas en el lado de C ++, como declarar la función de C ++ externa.

Si puede declarar su función C ++ externa '' C '', es fácil. Simplemente haga eso en el lado de C ++ y use las características de importación C estándar de Ada en el lado de Ada.

Ejemplo:

en tu cpp:

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

en su .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);

Es posible que le interese este documento, que analiza un enlace a nivel de objeto de Ada a C ++:

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

Además, la versión reciente de GNAT presenta un potente generador de enlace automático.

No parece posible ...

Información de aquí

" La interfaz directa a C ++ desde Ada está fuera del alcance de Ada (al menos 95) "

swig podría hacerlo

No he tocado a Ada desde 99/00, por lo que mi memoria puede ser un poco incompleta, pero cuando estábamos trabajando en una aplicación gráfica de Windows en Ada, necesitábamos hacer algunas cosas en C ++ (no críticas para la misión) y la forma en que incorporé los dos para tener el material c ++ en un dll (s) y luego crear un contenedor C para esa DLL y luego usar una interfaz pragma que especificara el contenedor c y luego podríamos llamar a los métodos dentro del dll desde esa interfaz.

Creo que equivale a un mantenimiento triple porque las firmas del método tuvieron que actualizarse en la interfaz de pragma y el contenedor C si cambiaron en el dll de c ++.

Básicamente fue un dolor. Creo que tuvimos que usar una directiva Win32 Lean y Mean precomplier en el contenedor C.

De todos modos, eso es lo que los tres que trabajamos en el proyecto podemos recordar.

Green Hills Software también publicó un excelente PDF sobre esto.
http://www.ghs.com/download/whitepapers/ada_c++.pdf

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top