艾达:包不允许身体

时间:2012-09-27 21:55:58

标签: ada gnat

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

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;

3 个答案:

答案 0 :(得分:8)

如果规范包含需要正文的内容,则只允许包具有正文。 (这样可以避免在构建中意外遗留可选主体的问题。)

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

如果您添加声明:

procedure Foo;

规范,应该(a)修复错误,(b)允许程序包的客户端调用该程序。或者,如果您不希望客户端看到该过程,您可以使用pragma Elaborate_Body;要求它拥有正文。

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

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

  

package_body应该是之前的完成   package_declaration或generic_package_declaration。图书馆   package_declaration或library generic_package_declaration不得   有一个身体,除非它需要一个身体; pragma Elaborate_Body可以   曾经要求library_unit_declaration有一个正文(见10.2.1)   如果它不需要一个。

答案 1 :(得分:3)

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

private
    procedure Foo;

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

答案 2 :(得分:1)

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

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

<强> ORIGINAL

  

entier_paquetage.adb:4:01:此套餐的规格不允许身体

     

Si la spec ne demande pas un corps,le corps n'estpasautoisé。在peut上   forcer un corps en mettant“pragma elaborate_body;” dans la spec。

<强>英语

  

如果规范不要求(或要求)身体,身体将不会被授权。我们可以通过放置“pragma elaborate_body”强制身体