请注意,您使用的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 编译器可以把不同的编译单元到同一个文件中)——但是嵌套包必须在编译其封闭单元的同时编译,除非它被特别标记为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;