使用GNAT编译器,当我尝试编译或检查以下文件的语义时,我得到一些错误的变体package "Foo" does not allow a body.我是这门语言的新手,无法在互联网上的任何地方找到这个看似基本问题的答案.请指教.
foo.ads
package Foo is
type Shape_Enum is (Circle, Triangle, Rectangle);
end Foo;
Run Code Online (Sandbox Code Playgroud)
foo.adb
package body Foo is
procedure Foo is
MyShape : Shape_Enum;
begin
MyShape := Rectangle;
end Foo;
end Foo;
Run Code Online (Sandbox Code Playgroud)
如果规范包含需要正文的内容,则只允许包具有正文.(这样可以避免在构建中意外遗留可选主体的问题.)
你在package(Foo.Foo)的主体中有一个过程,但没有办法调用它.
如果你添加一个声明:
procedure Foo;
Run Code Online (Sandbox Code Playgroud)
应该(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),否则就不需要了.