5

使用 GNAT 编译器,当我尝试编译或检查以下文件的语义时,我得到了一些错误的变体package "Foo" does not allow a body。我是这门语言的新手,在 Internet 上的任何地方都找不到这个看似基本问题的答案。请指教。

foo.ads

package Foo is
   type Shape_Enum is (Circle, Triangle, Rectangle);
end Foo;

foo.adb

package body Foo is
   procedure Foo is
      MyShape : Shape_Enum;
   begin
      MyShape := Rectangle;
   end Foo;   
end Foo;
4

3 回答 3

10

仅当规范包含需要主体的内容时,才允许包具有主体。(这避免了可选主体可能意外地被排除在构建之外的问题。)

您在包体 ( Foo.Foo) 中有一个过程,但无法调用它。

如果添加声明:

procedure Foo;

根据规范,这应该 (a) 修复错误,并且 (b) 允许程序包的客户端调用该过程。或者,pragma Elaborate_Body;如果您不希望该过程对客户可见,则可以使用它来要求它具有主体。

顺便说一句,与包含它的包同名的过程并没有什么特别之处(不像在 C++ 中,这样的函数是包含类的构造函数)。使用不同的名称可能会更清楚。

请参阅 Ada 参考手册的第 7.2 节(我使用的是 2012 标准的最新草案):

package_body 应是先前 package_declaration 或 generic_package_declaration 的完成。库 package_declaration 或库 generic_package_declaration 除非需要主体,否则不应有主体;pragma Elaborate_Body可以用来要求 library_unit_declaration 有一个主体(见 10.2.1),如果它不需要一个。

于 2012-09-27T22:16:17.307 回答
3

您还可以通过添加以下内容将函数声明为私有:

private
    procedure Foo;

到规范。这将防止它在包装外使用。

于 2012-09-29T02:24:57.410 回答
1

显然,Ada 需要您明确地强制使用pragma elaborate_body. 我在这里找到了答案:

http://objectmix.com/ada/338459-erreur-de-compilation.html#post1225079(感谢上帝,我会说法语):

原来的

entier_paquetage.adb:4:01: 这个包的规范不允许一个正文

Si la spec ne demande pas un corps, le corps n'est pas autorisé。在 peut forcer un corps en mettant “pragma expand_body;” 丹斯拉规格。

英语

如果规范不要求(或要求)主体,则主体将不会被授权。我们可以通过输入“pragma expand_body;”来强制一个body;

于 2012-09-27T22:39:36.050 回答