Ada 访问无参数过程"wrong convention"



我具有以下绑定:

function atexit(proc : access Procedure) return Integer with
    Import, Convention => C;

以及过程:

procedure Exiting is
begin
    Put_Line("Exiting");
end Exiting;

当我尝试称其为:

I : Integer := atexit(Exiting'Access);

subprogram "Exited" has wrong convention

失败

然而,提供我自己的(不兼容的(atexit,它接受参数,然后修改Exiting使用相同的参数,允许通过该过程来很好。

因此,问题似乎是将无参数过程作为访问类型传递。

我尝试给出

的命名访问类型
type Procedure_Access is access Procedure;

但结果完全相同。

如何通过无参数过程?

您可能已经忘记了ExitingProcedure_Access声明中的Convention方面。以下在2018年GNAT CE中的作品:

foo.c

int _atexit(void (*f)(void))
{
  (*f)();
  return 0;
}

main.adb

with Ada.Text_IO;  use Ada.Text_IO;
with Interfaces.C; use Interfaces.C;
procedure Main is
   type proc_ptr is access procedure
     with Convention => C;
   function atexit(proc : proc_ptr) return int
     with Import, Convention => C, Link_Name => "_atexit";

   procedure Exiting
     with Convention => C;      
   procedure Exiting is
   begin
      Put_Line("Exiting");
   end Exiting;

   I : Integer := Integer (atexit (Exiting'Access));
begin
   Put_Line("atexit returned " & I'Image);
end Main;

default.gpr

project Default is
   for Source_Dirs use ("src");
   for Object_Dir use "obj";
   for Main use ("main.adb");
   for Languages use ("Ada", "C");
end Default;

输出

Exiting
atexit returned  0

最新更新