Ada 访问无参数过程 "wrong convention"
Ada Access to parameterless procedure "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;
但是结果完全一样
那我怎样才能传递一个无参数过程呢?
您可能忘记了 Exiting
和 Procedure_Access
声明中的 Convention
方面。 GNAT CE 2018 中的以下作品:
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
我有以下绑定:
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;
但是结果完全一样
那我怎样才能传递一个无参数过程呢?
您可能忘记了 Exiting
和 Procedure_Access
声明中的 Convention
方面。 GNAT CE 2018 中的以下作品:
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