キーワードseparate
を使用していることに注目して、あなたの質問は子の単位ではなくネストされた単位であることを念頭に置いています。
次のことを試してみてください。
Testing.adb
With
Ada.Text_IO,
Parent;
Procedure Testing is
Begin
Ada.Text_IO.Put_Line("Starting Test:");
Parent.Nested.Test_Procedure;
Ada.Text_IO.Put_Line("Testing complete.");
End Test;
Parent.ads
Package Parent is
Package Nested is
Procedure Test_Procedure;
End Nested;
End Parent;
Parent.adb
Package Body Parent is
Package Body Nested is separate;
End Parent;
Parent-Nested.adb
(注:あなたは、私が「ドット交換」のデフォルト設定でGNATを使用しているファイル名のためにわずかに異なるものを使用する必要があります)
with Ada.Text_IO;
separate (Parent)
package body Nested is
Procedure Test_Procedure is
Message : Constant string:= ASCII.HT &
"Hello from the separate, nested test-procedure.";
begin
Ada.Text_IO.Put_Line(Message);
end Test_Procedure;
End Nested;
あなたはコンパイルすることができるはずですし、次のように出力が三行する必要があります:
Starting Test:
Hello from the separate, nested test-procedure.
Testing complete.
ここでの問題は、ネストされたと子パッケージ間の差異に関する若干の誤解から生じています。両方とも、ドット区切り付きの同じ方法でアクセスされます。Parent
。Nested
およびParent
。Child
。
微妙な違いは、子パッケージは常に別々にコンパイルされたユニットであるということです(GNATでは、それらは常に別のファイルにあります。これはライブラリの実装方法による実装制限ですが、 Adaコンパイラは異なるcompilation_unitを同じファイルに置くことができます)。しかし、ネストされたパッケージは、具体的にseparate
とタグ付けされていない限り、その包含単位がコンパイルされると同時にコンパイルされなければなりません。
現在の入れ子構造を維持し、まだ使用するためには、あなたがパッケージのすべての仕様を保持する単一の補助パッケージに次のメソッドを使用することができます分けます。
Parent.ads
Package Parent is
-- Here's the magic of renaming. --'
Package Nested renames Auxiliary.Delegate;
End Parent;
Auxiliary.ads
Package Auxiliary is
Package Delegate is
Procedure Test_Procedure;
End Delegate;
End Auxiliary;
Auxiliary.adb
package body Auxiliary is
Package Body Delegate is separate;
end Auxiliary;
Auxiliary-Delegate.adb
(注意:あなたは、ファイル名のためにわずかに異なるものを使用する必要があり、私は「ドット交換」のデフォルト設定でGNATを使用しています)
with Ada.Text_IO;
separate (Auxiliary)
package body Delegate is
Procedure Test_Procedure is
Message : Constant string:= ASCII.HT &
"Hello from the separate, nested test-procedure.";
begin
Ada.Text_IO.Put_Line(Message);
end Test_Procedure;
End Delegate;
"is separate"は、巨大なサブルーチンを独自のソースファイルに移動するためのものです。パッケージのためにnessecaryではありません。ルーチンの場合は、代わりにルーチンを単純化するのが普通です。私が取り組んだプロジェクトの多くは、実際にその使用を禁止しています。ユーザーとしては、それが何をしているのかを学ぶことをお勧めします。そうすれば、それを使用するコードを読むことができますが、自分では使用しないでください。 –
巨大なファイルで終わらないのですか?私はモンスターサイズのファイルを持つことを避けようとしています。すべてのコードを.adsと.adbに入れると、コメントは約6000行になります。 – Awaken
ファイルが巨大な場合は、パッケージが複数のパッケージに分割されている必要があります(それぞれが独自のファイルを取得し、膨大なファイルの問題も解決します)。同様に、1つのルーチンが巨大である場合、ほとんどの場合、複数のルーチン(または極端な場合はパッケージ全体)に分割する必要があります。 –