注意到您使用的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_units放入同一個文件中),但是嵌套包必須在編譯時纔會編譯它的封裝單元,除非它被專門標記爲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;
「是分離的」實際上意味着將巨大的子程序移動到它們自己的源文件中。這對包裝來說並不是必需的。對於例程來說,它通常是一個更好的主意,而不是簡化例程。我所從事的許多項目實際上都禁止使用它。作爲用戶,我建議你學習它的功能,以便你可以閱讀使用它的代碼,但是不要自己使用它。 – 2013-05-03 18:29:08
難道你最終沒有大文件?我試圖避免有一個怪物大小的文件。如果我把所有的代碼放在.ads和.adb中,它大約有6000條評論。 – Awaken 2013-05-05 11:36:48
如果文件很大,你的軟件包幾乎肯定需要分解成多個軟件包(每個軟件包都有自己的文件,解決了大文件問題)。同樣,如果一個例程很龐大,幾乎肯定需要分解成多個例程(甚至在極端情況下甚至是整個軟件包)。 – 2013-05-05 13:30:12