Ada:将访问转换为常量以访问变量

时间:2017-08-05 00:17:37

标签: pointers constants ada

将访问权限转换为常量访问权限的正确方法是什么 变量? (是的,我知道那时我需要注意不要修改它 "可变"。)

也许Unchecked_Conversion

可是:

  1. 标准保证Unchecked_Conversion能够很好地发挥作用 情况?

  2. 是否有比Unchecked_Conversion更简单的方法?

2 个答案:

答案 0 :(得分:3)

Unchecked_Conversion无法保证在这种情况下有效,因为Ada不会对访问类型的内存布局提供任何保证。据推测,Ada故意允许编译器为每种访问类型提供独特的内存布局和含义。

如果向访问类型添加Convention => C方面,则可以获得所需的公共内存布局,因为C认为所有指针都在相同的地址空间上运行。

答案 1 :(得分:2)

好的,正在发生的事情是[可能]参数模式(可能是类型定义)在某处不匹配。

让我们说有几种类型:

Type Window(<>) is tagged private;
Type Constant_Reference is not null constant access Window'Class;
Type Reference is not null access Window'Class;
Type Handle is access Window'Class;

鉴于Function Get_Handle ( Object : in out aliased Window'Class )我们可以对Object'Access说些什么?好吧,它是对Window'Class的访问,它不是常数 - 因此它与HandleReference兼容,但不与Constant_Reference兼容。

另一方面,如果我们有Function Get_Handle ( Object : aliased Window'Class ),那么Object'Access将产生一个与Constant_Reference兼容的匿名访问,因为in-parameter的性质不变。

因此,请检查您的参数和设计,看看是否会导致您的问题。