【发布时间】:2017-08-05 00:17:37
【问题描述】:
将访问常量转换为访问的正确方法是什么 多变的? (是的,我知道那我需要小心不要修改这个 “变量”。)
也许Unchecked_Conversion?
但是:
标准是否保证
Unchecked_Conversion在此工作良好 案例?有没有比
Unchecked_Conversion更简单的方法?
【问题讨论】:
将访问常量转换为访问的正确方法是什么 多变的? (是的,我知道那我需要小心不要修改这个 “变量”。)
也许Unchecked_Conversion?
但是:
标准是否保证Unchecked_Conversion 在此工作良好
案例?
有没有比Unchecked_Conversion更简单的方法?
【问题讨论】:
Unchecked_Conversion 不能保证在这种情况下工作,因为 Ada 不保证访问类型的内存布局。据说 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 兼容的匿名访问,这是由于in-parameter 的恒定性质。
因此,请检查您的参数和设计,看看是否是导致您的问题的原因。
【讨论】: