将访问权限转换为常量访问权限的正确方法是什么 变量? (是的,我知道那时我需要注意不要修改它 "可变"。)
也许Unchecked_Conversion
?
可是:
标准保证Unchecked_Conversion
能够很好地发挥作用
情况?
是否有比Unchecked_Conversion
更简单的方法?
答案 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的访问,它不是常数 - 因此它与Handle
和Reference
兼容,但不与Constant_Reference
兼容。
另一方面,如果我们有Function Get_Handle ( Object : aliased Window'Class )
,那么Object'Access
将产生一个与Constant_Reference
兼容的匿名访问,因为in-parameter的性质不变。
因此,请检查您的参数和设计,看看是否会导致您的问题。