这两个文件之间有什么区别吗?

时间:2010-06-22 09:13:41

标签: ada

我有两个ada文件,如下所示

A1.ada

procedure KOR616 is

   I : Integer := 3;

   procedure Lowest_Level( Int : in out Integer );
   pragma Inline( Lowest_Level );

   procedure Null_Proc is
   begin
      null;
   end;

   procedure Lowest_Level( Int : in out Integer ) is
   begin
      if Int > 0 then
         Int := 7;
         Null_Proc;
      else
         Int := Int + 1;
      end if;
   end;

begin
   while I < 7 loop
      Lowest_Level( I );
   end loop;
end;

下面显示的是 B1.ada

procedure Lowest_Level( Int : in out Integer );
pragma Inline( Lowest_Level );

procedure Lowest_Level( Int : in out Integer ) is

   procedure Null_Proc is
   begin
      null;
   end;

begin
   if Int > 0 then
      Int := 7;
      Null_Proc;
   else
      Int := Int + 1;
   end if;
end Lowest_Level;

with Lowest_Level;
procedure KOR618 is

   I : Integer := 3;

begin
   while I < 7 loop
      Lowest_Level( I );
   end loop;
end;

这两个文件有什么区别吗?

4 个答案:

答案 0 :(得分:2)

如上所述,KOR616(A1)和KOR618(B1)将具有相同的效果。区别在于可见性(当然,编译的代码会有所不同,但我怀疑这很重要。)

在A1中,Null_Proc和Lowest_Level的主体都可以看到I,但是KOR616之外的任何东西都看不到它们。此外,KOR616的主体可以看到Null_Proc。

在B1中,Lowest_Level(但不是Null_Proc)对整个程序可见,而不仅仅是KOR618。

答案 1 :(得分:1)

在B1中,Null_Proc没有内联。 (它不在Lowest_Level范围内。)

答案 2 :(得分:1)

A1中,procedure Null_Proc 不是嵌套在procedure Lowest_Level中;在B1中, 嵌套在procedure Lowest_Level中。关于pragma Inline,“实施可以自由遵循或忽略pragma所表达的建议。”我希望嵌套子程序的内嵌依赖于实现。

答案 3 :(得分:1)

嗯,主要区别在于,在Null_Proc之外的第二个示例中Lowest_Level不可用。在第一个示例中,如果您以后可以使用KOR618或之后添加的任何其他例程,也可以调用Null_Proc

通常我不会在其他例程中定义例程,除非有一些理由说明内部例程在外部例程之外没有意义。显而易见的例子是,如果内部例程对外部例程中声明的局部变量进行操作(不将它们作为参数传递)。

在这种情况下,Null_Proc就像它所获得的一般操作一样,所以我没有看到任何令人信服的理由在Lowest_Level内部查询它。当然,它根本不做任何事情,所以我没有任何令人信服的理由让它首先存在。 : - )