Ada 不一致的参数传递模式

Ada 不一致的参数传递模式,ada,Ada,考虑以下代码(使用GCC 4.7.4编译): 过程Proc应该确保参数N不会在其体内被读取,这是一个out参数。但它将此参数传递给一个过程Sub_Proc,该过程接受一个in-out参数,因此可能会在该过程中读取前面的参数,而调用过程则确保了相反的结果 这是GCC错误还是Ada标准的特殊性?您将在子进程(N)上收到警告调用:“N”可能在有值之前被引用。因此,编译器试图提供帮助 在中,您的程序可能是非法的:6.4.1(3)说“对于模式输入输出,变量不能是模式输出的形式参数”。事实上,使用-gnat

考虑以下代码(使用GCC 4.7.4编译):

过程
Proc
应该确保参数
N
不会在其体内被读取,这是一个out参数。但它将此参数传递给一个过程
Sub_Proc
,该过程接受一个in-out参数,因此可能会在该过程中读取前面的参数,而调用过程则确保了相反的结果


这是GCC错误还是Ada标准的特殊性?

您将在
子进程(N)上收到警告调用:
“N”可能在有值之前被引用
。因此,编译器试图提供帮助

在中,您的程序可能是非法的:6.4.1(3)说“对于模式输入输出,变量不能是模式输出的形式参数”。事实上,使用
-gnat83
,在稍微重新排列代码以允许其编译后,与上述警告等价的是错误
(Ada 83)非法读取输出参数

在中,可以在赋值后读取
out
参数的值;在ARM95 6.4.1(15)中,我们发现该值未初始化(如上所述的警告消息所示),因此使用它是一个坏主意

所以答案是,蚊虫的行为符合标准

procedure Main is
    procedure Sub_Proc(N : in out Integer) is
        M : Integer;
    begin
        M := N;
    end;
    procedure Proc(N : out Integer) is
    begin
        Sub_Proc(N);
    end;

    N : Integer;
begin
    Proc(N);
end Main;