首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ada中类型/包别名的单独声明

Ada中类型/包别名的单独声明
EN

Stack Overflow用户
提问于 2012-05-03 23:04:56
回答 3查看 880关注 0票数 2

我想声明一些“用户定义的编译器常量”,以使我的规范文件尽可能保持“常量”。这在C++中很常见,例如:

代码语言:javascript
复制
// misc/config.hh
namespace misc
{
  typedef std::shared_ptr<A> A_ptr; 
  namespace arch = ibmpc;
}

// misc/code.hh
#include "misc/config.hh"
namespace misc
{
  void function p(A_ptr a);
}

它将在Ada中:

代码语言:javascript
复制
-- misc.ads
package Misc is
  use Types; ----> forbidden !

  procedure P(A : A_Access);
end Misc;

-- misc-types.ads
package Misc.Types is
  type A_Access is A'Access;
end Misc.Types;

当然这是行不通的,因为use是一个上下文,我的问题是:如何在keyword...hence中做一些同样的事情呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-09 20:17:31

我认为这是从你的C++到Ada的一个合理的映射:

首先,我认为在文件misc.ads中,或多或少地对应于您的namespace misc

代码语言:javascript
复制
package Misc is
end Misc;

然后,在文件misc-config.ads中,对应于config.hh

代码语言:javascript
复制
package Misc.Config is
   type A is (For_Example, An_Enumeration);
   type A_Access is access A;
end Misc.Config;

(当然,它也可以引用Misc中的类型)。然后,在文件misc-code.ads中,对应于code.hh

代码语言:javascript
复制
with Misc.Config;
package Misc.Code is
   use Config;
   procedure P (A : A_Access);
end Misc.Code;

就我个人而言,我不会使用use Config;,至少在规范中是这样的--这会让我很难弄清楚什么东西是在哪里定义的。注意,在显示的地方,您可以说use Config;use Misc.Config;,因为您在Misc的子句中;在context子句中,这也是可以的,您必须使用use Misc.Config;

票数 3
EN

Stack Overflow用户

发布于 2012-05-04 00:17:31

好吧,虽然我知道你在尝试做什么,但你做错了。给定的sniplet的问题是:循环依赖。

现在,Ada有一个很好的方法来管理循环依赖,通过使用specs和by使其成为非循环的(在某种意义上)。由于两者是离散的,我们可以有两组规范/主体文件,其中主体精确地引用另一个规范,因为规范是公开可见的。

举个例子,无可否认是荒谬的;让我们使用钢笔和墨盒。

代码语言:javascript
复制
With Cartridge;
Package Pen is

  Subtype Model_Number is Positive Range 1000..3304;
  Type Fountain_pen is private;
  -- Pen procedures
private
  Type Fountain_pen is Record
 Model  : Model_Number;
     Ink    : Cartridge.Ink_Cartridge;
  end record;      
end Pen;

代码语言:javascript
复制
With Pen;
Package Cartridge is
  Type Ink_Cartridge is private;
  -- Ink procedures
private
  Type Ink_Cartridge is record
     Color      : Integer; -- I'm being lazy.
     This_Pen   : Pen.Fountain_pen;
  end record;
end Cartridge;

代码语言:javascript
复制
Package Body Pen is
  --- Pen Stuff
end Pen;

Package Body Cartridge is
  -- Ink stuff
end Cartridge;

(未编译。)我忘记了如何创建循环嵌套类型的组件……不管怎么说,你应该对此有个大概的了解。但是,您需要的是与相互依赖的类型根本不同的类型;您需要的是常量的某种容器。

我建议使用子包。类似于MiscMisc.Constants;将基类型放入Misc,将常量放入Misc.Constants。如果您的类型依赖于您的常量,那么您可以为它们创建一个单独的子包Misc.Types,并使用如上所示的mutual withing。

票数 1
EN

Stack Overflow用户

发布于 2012-05-04 14:34:13

您可以将子包规范放在父包规范中,如下所示:

代码语言:javascript
复制
package Misc is
   package Types is
      type A is private;
      type A_Access is access A;
      -- other stuff
   end Types;

   procedure P (A : Types.A_Access);
end Misc;

您甚至可以在Misc.Types声明之后使用use Types;

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10434117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档