将访问转换为常量以访问 变量的正确方法是什么? (是的,我知道那么我需要小心不要修改这个 “变量”。)Ada:将访问转换为常量以访问变量
也许Unchecked_Conversion
?
但是:
是
Unchecked_Conversion
的标准保证在这种情况下, 很好地工作?有没有比
Unchecked_Conversion
更简单的方法?
将访问转换为常量以访问 变量的正确方法是什么? (是的,我知道那么我需要小心不要修改这个 “变量”。)Ada:将访问转换为常量以访问变量
也许Unchecked_Conversion
?
但是:
是Unchecked_Conversion
的标准保证在这种情况下, 很好地工作?
有没有比Unchecked_Conversion
更简单的方法?
Unchecked_Conversion
不能保证在这种情况下工作,如阿达不给你访问类型的内存布局任何保证。据推测,Ada有意允许编译器为每种访问类型设置独特的内存布局和含义。
如果您将Convention => C
方面添加到您的访问类型中,您可能会得到所需的公用内存布局,因为C认为所有指针都在相同的地址空间上运行。
好吧,发生了什么事情[有可能]在参数模式(可能是类型定义)的某处存在不匹配。
比方说,有几个类型:
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
兼容。
因此,检查你的参数和你的设计,看看是否是什么导致你的问题。