参数传递模式不一致

时间:2014-05-20 21:14:20

标签: ada

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

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;

程序Proc应该确保永远不会在他的身体内读取作为 out参数的参数N。但它将此参数传递给过程Sub_Proc,该过程在参数中使用,因此可能会在此过程中读取前一个参数,而调用过程则确保相反。

是GCC错误还是Ada标准特异性?

1 个答案:

答案 0 :(得分:7)

您将在Sub_Proc(N);来电时收到警告:"N" may be referenced before it has a value。所以编译器试图提供帮助!

Ada 83中,你的程序本来是非法的:6.4.1(3)说“对于模式输出,变量不能是模式输出的形式参数”。的确,使用{{1在对代码进行小规模重新排列以允许编译之后,与上述警告相当的是错误-gnat83

Ada 95Ada 2012中, 可以在分配后查看(Ada 83) illegal reading of out parameter参数的值;在ARM95 6.4.1(15)中,我们发现该值未初始化(如上面提到的警告消息所示),因此使用它是一个坏主意。

所以答案是,GNAT的行为符合标准。