1

以下に示す2つの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;

これら2つのファイルに違いはありますか?

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

A1procedure Null_Proc ネストされていませんprocedure Lowest_Level。でB1、にネストされprocedure Lowest_Levelます。に関しては、「実装は、プラグマpragma Inlineによって表現された推奨事項に従うか、無視することができます。」ネストされたサブプログラムのインライン化は実装に依存すると思います。

于 2010-06-22T16:37:22.007 に答える
1

B1 では、Null_Proc はインライン化されていません。(Lowest_Level 内ではありません)。

于 2010-06-22T09:17:51.943 に答える
1

主な違いは、2 番目の例Null_Procでは 以外では使用できないことですLowest_Level。最初の例では、後で必要に応じてKOR618、または後で追加する可能性のある他のルーチンを呼び出しますNull_Proc

一般に、内部ルーチンが外部ルーチンの外では意味をなさない何らかの理由がない限り、そのような他のルーチン内でルーチンを定義しません。明白な例は、内側のルーチンが外側のルーチンで宣言されたローカル変数を (パラメーターとして渡さずに) 操作する場合です。

この場合、Null_Proc はほぼ一般的な操作であるため、そのLowest_Levelように内部で処理する説得力のある理由は見当たりません。もちろん、それはまったく何もしないので、そもそも存在する説得力のある理由はありません。:-)

于 2010-06-25T05:36:29.030 に答える