¿Puedes llamar a las funciones de Ada desde C ++?
-
05-07-2019 - |
Pregunta
Soy un completo novato de Ada, aunque he usado Pascal durante 2 o 3 años durante el HS.
IIRC, es posible llamar a las funciones compiladas de Pascal desde C / C ++. ¿Es posible llamar a procedimientos & amp; ¿Funciones escritas en Ada desde C ++?
Solución
De acuerdo con este tutorial antiguo , debería ser posible.
Sin embargo, como se ilustra en este hilo , debe tener cuidado con el c ++ extern " C " Definiciones de tus funciones de Ada.
Otros consejos
Aquí hay un ejemplo usando g ++ / gnatmake 5.3.0:
NOTA: tenga cuidado al pasar datos entre C ++ y Ada
ada_pkg.ads
package Ada_Pkg is
procedure DoSomething (Number : in Integer);
pragma Export (C, DoSomething, "doSomething");
end Ada_Pkg;
ada_pkg.adb
with Ada.Text_Io;
package body Ada_Pkg is
procedure DoSomething (Number : in Integer) is
begin
Ada.Text_Io.Put_Line ("Ada: RECEIVED " & Integer'Image(Number));
end DoSomething;
begin
null;
end Ada_Pkg;
main.cpp
/*
TO BUILD:
gnatmake -c ada_pkg
g++ -c main.cpp
gnatbind -n ada_pkg
gnatlink ada_pkg -o main --LINK=g++ -lstdc++ main.o
*/
#include <iostream>
extern "C" {
void doSomething (int data);
void adainit ();
void adafinal ();
}
int main () {
adainit(); // Required for Ada
doSomething(44);
adafinal(); // Required for Ada
std::cout << "in C++" << std::endl;
return 0;
}
Referencias:
Ese tipo de cosas se hacen todo el tiempo. El truco es decirle a ambas partes que utilicen un protocolo de llamada de estilo "C" para la rutina. En C ++ esto se hace con extern " C " Declaraciones, y en el lado de Ada con Pragma Export (" C " ;, ...
Busque esos en sus respectivas fuentes de referencia favoritas para obtener detalles. ¡Cuidado con los punteros y los parámetros de referencia!
Absolutamente es posible. Durante los últimos cinco años he estado trabajando en un sistema que mezcla C ++ y Ada.
Sí. Hace varios años escribí una breve demostración simple para probarlo. Había dos DLL, una escrita en C ++ y la otra en Ada. Acaban de agregar constantes a los valores de punto flotante. Dos aplicaciones, una en C ++ y una en Ada, utilizaron ambas la DLL. Así que existía toda combinación posible de llamadas a C ++ / llamadas desde Ada. Todo funcionó bien. Esto estaba en Windows cualquiera que sea la versión actual en ese momento; No lo recuerdo, pero es posible que haya funcionado en Linux o BeOS.
Ahora si tan solo pudiera encontrar el código fuente de eso ...