使用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;
答案 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”强制身体