1

我有两个 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

4 回答 4

2

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

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

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

于 2010-06-23T20:42:40.527 回答
1

好吧,主要区别在于,在第二个示例Null_Proc中,在Lowest_Level. 在第一个示例中,如果您以后喜欢它,您可以拥有KOR618或稍后添加的任何其他例程,也可以调用Null_Proc

一般来说,我不会在其他例程中定义例程,除非内部例程在外部例程之外没有任何意义。一个明显的例子是,如果内部例程对外部例程中声明的局部变量进行操作(不将它们作为参数传递)。

在这种情况下,Null_Proc 几乎是一个通用的操作,所以我看不出有任何令人信服的理由将其隐藏在内部Lowest_Level。当然,它根本没有做任何事情,所以我没有任何令人信服的理由让它首先存在。:-)

于 2010-06-25T05:36:29.030 回答
1

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

于 2010-06-22T16:37:22.007 回答
1

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

于 2010-06-22T09:17:51.943 回答