我有一个快速的Ada问题。如果我有一个可能写出变量的过程,或者可能不管它,那么它应该是Out
参数还是{{1参数?我想这归结为这个问题:
如果调用者调用参数为In Out
的过程,则调用者会看到什么,但该过程不会触及该参数。它看到相同的价值吗?未定义的行为?
编译器没有抱怨,因为它看到Out
变量的赋值...它恰好是在条件中,可能无法到达,编译器也懒得检查所有路径。
我怀疑安全的赌注是将参数标记为Out
,但我想知道这是否有必要或仅仅是风格上更好。
谢谢!
-prelic
答案 0 :(得分:11)
在Ada中,当具有out
参数的过程不向该参数写入任何内容时,返回给调用者的结果是 undefined 。这意味着调用者中的该变量中的任何内容都会在从过程返回时被垃圾覆盖。
Ada中的最佳做法是在过程开始时使用合适的默认值明确初始化所有out
参数。这样,程序之外的任何代码路径都会将有效数据传递回调用者。
如果调用者中有某些内容可能会通过某个过程更改 ,则必须使用in out
参数。
对于任何其他类型,形式参数未初始化。如果是复合,则会评估实际参数到形式的标称子类型的视图转换(可能会引发Constraint_Error),并且形式的实际子类型是视图转换的子类型。如果是初等的,形式的实际子类型由其名义子类型给出。