在 Ada 中有三种“正常”的参数传递模式:in
、out
和in out
. 但是还有第四种模式,access
……有什么需要它们的吗?
(即原本不可能的事情。)
现在,我知道 GNAT JVM Ada 编译器在导入的 [库] 规范中大量使用了它们。(此外,可以说它们对于 C/C++ 翻译至关重要。)
在 Ada 中有三种“正常”的参数传递模式:in
、out
和in out
. 但是还有第四种模式,access
……有什么需要它们的吗?
(即原本不可能的事情。)
现在,我知道 GNAT JVM Ada 编译器在导入的 [库] 规范中大量使用了它们。(此外,可以说它们对于 C/C++ 翻译至关重要。)
访问模式的主要驱动因素之一是解决在 Ada 2012 之前的限制,即函数参数只能是模式“in”。
因此,尽管在某些领域它们可能仍然是合适的解决方案,但可能在绑定中,Ada 2012 将允许的函数参数模式放宽到现在包括“in out”,这可能会显着减少对访问模式的需求。
不管它们有什么其他用途,我更喜欢在编码绑定到接收指针的 C API 时使用它们(当且仅当 0 不是 C 端该参数的有效值时)。
这样在 Ada 方面,我可以处理一个不错的对象,而不是一个容易出错的凌乱指针。
当然,您可以只在绑定中指定参数是通过引用传递的,这也是同样的事情。
access
在我最新的项目中,到目前为止,我唯一需要使用的是在定义我自己的流子程序(Read
、、Write
等X'Class'Output
)时。这些函数需要not null access Ada.Streams.Root_Stream_Type'Class
作为参数。
例如:
package Example is
type Printable_Type is private;
procedure Print_Printable(
Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Print : in Printable_Type);
for Printable_Type'Write use Print_Printable;
end Example