在Ada中的In/Out和Out的区别

6

我有一个关于Ada的问题。如果我有一个过程,在其中我可能会写入一个变量,或者也可能什么也不做,那么它应该是一个Out参数还是In Out参数?我想这归结为一个问题:

如果调用者调用了一个带有Out参数的过程,但该过程没有触及参数,调用者会看到什么?它将看到相同的值还是未定义的行为?

编译器不会抱怨,因为它看到了对Out变量的赋值...只是它恰好在条件语句中,可能永远不会被执行,并且编译器并不会检查所有路径。

我怀疑最安全的方法是将参数标记为In Out,但我想知道这是否必要,还是只是风格上的偏好。

谢谢!

-prelic

1个回答

13
在Ada编程语言中,当一个带有out参数的过程没有向该参数写入任何内容时,传递回调函数的结果是未定义的。这意味着调用者在变量中的任何内容都会被来自过程返回的垃圾所覆盖。
在Ada中最好的做法是,在过程开始时明确地使用适当的默认值初始化所有out参数。这样,从过程中任何代码路径出去的结果都会传递有效的数据回调函数。
如果你想让调用者的某个东西可能被过程改变,你必须使用in out参数。
Ada 95 RM 6.4.1(15)中得知:

对于任何其他类型,形式参数都是未初始化的。如果是复合类型,则对实际参数执行到正式子类型的视图转换(可能引发Constraint_Error),而正式子类型则是视图转换的实际子类型。 如果是基本类型,则形式参数的实际子类型由其指定的正式子类型给出。


1
谢谢!这里有更多的声望,看起来你非常需要它 ;) - prelic
对于像保姆般的语言,禁止任何稍有危险的事物,允许“out”参数就像将一支装满子弹的突击步枪放在非常容易触及的地方。 - ATL_DEV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接