5

我有一个带有普通规格和正文文件的主包。我正在尝试创建父级的子包,但希望它们在单独的编译文件中。如果它只是一个包体,或者它是一个子程序/proc/func,我可以很容易地完成它。但是,我不能让它让我制作一个子规格文件。

我这样做的原因是因为我想要一个孩子的信息可供同一父母的其他孩子使用。我知道我可以通过在父文件中包含规范部分来做到这一点,但这会使我的父文件变得非常大。

这甚至可能吗,还是我别无选择,只能制作另一个根单元?或者只是把所有规范都留在父母身上?

我试过了:

在父母中:( package Child1 is separate; 也尝试过 Parent.Child1 但这给出了编译错误

在孩子:

separate(Parent)

package Parent.Child1 is
....
end Parent.Child1;

想法?只是不可能?

更新:我正在使用 Green Hills Multi Compiler 进行编译。Ada95语言版本,非OO项目。

4

2 回答 2

8

请注意,您使用的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;

您应该能够编译并且输出应该是如下三行:

  1. Starting Test:
  2. Hello from the separate, nested test-procedure.
  3. Testing complete.

这里的问题源于对嵌套包和子包之间差异的轻微误解。两者都使用相同的点分隔限定方法访问:ParentNestedParentChild.

细微的区别是子包总是一个单独编译的单元(在 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;
于 2013-05-04T17:10:31.093 回答
5

是的,这完全没问题。您可以将父包和子包放在单独的文件中:

父级广告

package Parent is
-- ...
end Parent;

父子.ads

package Parent.Child is
-- ...
end Parent.Child;

parent-other.ads

limited with Parent.Child; --Need Ada 2005
package Parent.Other is
-- ...
end Parent.Other;

parent.childparent.other包可以访问中的定义parent(有一些限制)。

请注意parent.otherwiths”如何parent.child访问parent.child.

我有一个如何做到的例子。此外,这里有一个来自 wikibooks 的示例

于 2013-05-03T02:18:10.197 回答