Ada的In/Out vs Out

pre*_*lic 5 ada

我有一个快速的Ada问题.如果我有一个程序,我可以写出一个变量,或者我可能不管它,它应该是一个Out参数还是一个In Out参数?我想这归结为这个问题:

如果调用者调用带参数的过程,但调用Out程序没有触及参数,则调用者会看到什么.它看到相同的价值吗?未定义的行为?

编译器没有抱怨,因为它看到了对Out变量的赋值......它恰好处于条件中,可能无法到达,并且编译器不会费心去检查所有路径.

我怀疑安全的赌注是将参数标记为In Out,但我想知道这是否有必要或只是风格上更可取.

谢谢!

-prelic

Gre*_*ill 11

在Ada中,当带out参数的过程不向该参数写入任何内容时,传递给调用者的结果是未定义的.这意味着调用者中的该变量中的任何内容都会在从过程返回时被垃圾覆盖.

Ada的最佳实践是out在过程开始时使用合适的默认值最终初始化所有参数.这样,程序之外的任何代码路径都会将有效数据传递回调用者.

如果调用者中有某些内容可能被某个过程更改,则必须使用in out参数.

来自Ada 95 RM 6.4.1(15):

对于任何其他类型,形式参数未初始化.如果是复合,则会评估实际参数到形式的标称子类型的视图转换(可能会引发Constraint_Error),并且形式的实际子类型是视图转换的子类型.如果是基本的,形式的实际子类型由其标称子类型给出.