Ada 中受保护对象内部的访问类型

Access type inside protected objects in Ada

我正在尝试在 Ada 中实现一个受保护的对象,它引用了它拥有的一个过程。这是我的代码:

procedure sm is

    type StateHandler is access procedure;

    protected Motor is

    private
        procedure proc;

        x : StateHandler := proc'Access;

    end Motor;

    protected body Motor is
        procedure proc is
        begin
            Put_Line("HELLO WORLD");
        end proc;
    end Motor;


begin
    Put_Line("ASD");
end sm;

我也试过了Motor.proc'Access

当我尝试编译这段代码时,出现以下错误:

sm.adb:18:29: subprogram "proc" has wrong convention
sm.adb:18:29: does not match "StateHandler" declared at line 11
sm.adb:18:29: probable missing pragma Convention for "StateHandler"
gnatmake: "sm.adb" compilation error
Makefile:3: recipe for target 'ADA' failed
make: *** [ADA] Error 4

我试了很多方法都解决不了

有趣的一个!

"pragma convention" 控制诸如过程的调用约定之类的事情,因此如果您要连接到另一种语言,则可以在 proc 的声明之后添加 pragma Convention (C, proc);。这告诉编译器设置堆栈帧和参数来调用用 C 编写的过程(void 函数)。受保护的过程将具有与普通过程不同的调用约定,并且通过非受保护的 (可以这么说)访问类型可能有问题......但就我的情况而言。

我认为你需要阅读 this page of the Annotated ARM ... "For example, setting the Convention of a protected procedure to Ada is probably wrong. Rather than enumerating all such cases, however, we leave it up to implementations to decide what is sensible. "

不同的 CPU 对守卫、锁和原子操作有不同的要求,因此这允许 Ada 实现允许对有意义的目标使用相同的约定(并绕过这个问题)。

该页面链接到 AARM chapter 6.3.1 我们看到 "The default calling convention is protected for a protected subprogram, and for an access-to-subprogram type with the reserved word protected in its definition." 与约定 Ada 或 Intrinsic(或 C 或 Fortran)相对。作者们在这里涵盖了 "access to procedure" 问题。

还有宾果……

type StateHandler is access protected procedure;

这将 StateHandler 限制为指向具有受保护过程的正确调用约定的过程,例如本例中的 'proc'。

错误消息不是特别有用,除非您已经在其他上下文中处理过 pragma convention,这给了我足够的面包屑。