Недавно я столкнулся с критической системой безопасности, которая использует только Ada. Система предоставляет около 3 пакетов с примерно 200-300 функциями в каждом пакете в качестве источника.
Мне нужно получить доступ почти ко всем этим функциям в другой программной системе (очень красивой и аккуратной), полностью написанной на C / C ++.
Цель: Мне нужно выставить эти функции Ada на C / C ++.
Я понимаю, что могу использовать pragma Export()
Конструкция для экспорта функций и пакетов interface.C для преобразования параметров между C и Ada.
Но мне было интересно, есть ли более простой или более масштабируемый способ сделать это?
Было бы действительно полезно, если бы кто-то с подобным опытом мог указать мне правильное направление.
Помни я не ищу Переводчик Ada to C
Вы можете попробовать добавить Export
а также Convention => X
аспекты пакета, если вы используете компилятор Ada 2012; пример:
Package K with Export, Convention => C_Plus_Plus is
Function A( Input_1, Input_2 : Integer ) return Integer;
End K;
Это на самом деле компилируется, хотя, так как у меня нет проектов C ++ или C со смешанным исходным кодом, чтобы попробовать это, я не могу сказать вам, можно ли результаты строго использовать со стороны C ++.
Если это не сработает, возможно, лучшим способом было бы создать пакет, особенно для экспорта функций (и типов), которые будут использоваться на стороне C ++.
With
System,
Interfaces.C.Strings,
Interfaces.C.Pointers;
Package K with Convention => C_Plus_Plus is
-------------
-- TYPES --
-------------
Type CPP_Window_Handle is Private;
Subtype CPP_String is Interfaces.C.Strings.chars_ptr;
--------------
-- MODULES --
--------------
Package UI_Module is
Procedure Set_Title( Window : CPP_Window_Handle; Text : CPP_String )
with Export;
End UI_Module;
Private
Package STUB_TYPES is
Type Window is tagged null record;
End STUB_TYPES;
Use STUB_TYPES;
Type CPP_Window_Handle is not null access Window'Class
with Convention => C_Plus_Plus, Size => Interfaces.C.int'Size;
End K;
Реализуется как:
Package Body K is
Package STUB_FUNCTIONS is
Procedure Set_Window(Object : in out STUB_TYPES.Window'Class; Text : String) is null;
--'
End STUB_FUNCTIONS;
Package Ada_Dependencies renames STUB_FUNCTIONS;
Package Body UI_Module is
Procedure Set_Title( Window : CPP_Window_Handle; Text : CPP_String ) is
function Value (Item : CPP_String) return Interfaces.C.char_array
renames Interfaces.C.Strings.Value;
function Convert(Item : Interfaces.C.char_array;
Trim_Nul : Boolean := True) return String
renames Interfaces.C.To_Ada;
Begin
Ada_Dependencies.Set_Window(
Object => Window.all,
Text => Convert( Value( Text ) )
);
End Set_Title;
End UI_Module;
End K;
Других решений пока нет …