Можете ли вы вызывать функции Ada из C ++?
-
05-07-2019 - |
Вопрос
Я полный новичок в Ada, хотя я использовал Pascal в течение 2-3 лет во время HS.
IIRC, можно вызывать скомпилированные функции Pascal из C / C ++.Можно ли вызывать процедуры и функции, написанные на Ada, из C ++?
Решение
Согласно этому старому учебнику , это должно быть возможно. р>
Однако, как показано в этот поток , вы должны быть осторожны с c ++ extern " C " определения ваших функций Ada.
Другие советы
Вот пример использования g ++ / gnatmake 5.3.0:
ПРИМЕЧАНИЕ:Будьте осторожны при передаче данных между C ++ и Ada
ada_pkg.объявления
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;
}
Ссылки:
Такого рода вещи делаются постоянно. Хитрость заключается в том, чтобы сказать обеим сторонам использовать в процедуре протокол вызова в стиле «С». В C ++ это делается с помощью extern " C " декларации, а на стороне ада с прагмой Экспорт (" C " ;, ...
Подробности смотрите в ваших любимых справочных источниках. Следите за указателями и ссылочными параметрами!
Абсолютно это возможно. Последние пять лет я работаю над системой, которая смешивает C ++ и Ada.
ДА.Несколько лет назад я написал короткую простую демонстрацию, чтобы доказать это.Там было две библиотеки DLL, одна написана на C ++, а другая на Ada.Они просто добавили константы к значениям с плавающей запятой.Два приложения, одно на C ++ и одно на Ada, использовали обе библиотеки DLL.Таким образом, существовали все возможные комбинации вызова C ++ из Ada.Все это работало нормально.Это было в Windows, независимо от того, какая версия была актуальна на тот момент;Я не помню, но, возможно, это работало в Linux или BeOS.
Теперь, если бы только я мог найти исходный код из этого...