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

时间:2012-05-03 15:04:56

标签: packaging ada

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

// 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:

-- 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是一个上下文关键字...因此我的问题是:如何在Ada中做同样结果的事情呢?

3 个答案:

答案 0 :(得分:2)

我认为这是从C ++原版到Ada的合理映射:

首先,相应或多或少,我认为,对应namespace misc,文件misc.ads

package Misc is
end Misc;

然后,与文件config.hh中的misc-config.ads对应,

package Misc.Config is
   type A is (For_Example, An_Enumeration);
   type A_Access is access A;
end Misc.Config;

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

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的孩子;在上下文子句中,也没关系,你必须use Misc.Config;

答案 1 :(得分:1)

好的,虽然我看到你正在尝试做什么,但你错了。 给定的代码片段存在的问题是:循环依赖。

现在Ada通过使用specs和body来使循环依赖变得非常循环(在某种意义上),这是一种管理循环依赖的好方法。由于两者是离散的,我们可以有两组spec / body文件,其中正文引用另一个规范,因为规格是公开可见的。

作为一个例子,无可否认荒谬;让我们用钢笔和墨盒。

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;

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;

Package Body Pen is
  --- Pen Stuff
end Pen;

Package Body Cartridge is
  -- Ink stuff
end Cartridge;

(未编译。) 我忘了如何创建一个循环嵌套类型的组件,但是......无论如何,你应该在那里得到一般的想法。但是你想要的是根本不同于相互依赖的类型;你想要的是你的常数的某种容器。

我建议使用子包。像MiscMisc.Constants之类的东西;将基类型放入Misc的位置,以及Misc.Constants中的常量。如果您的类型取决于您的常量,您可以为它们Misc.Types创建一个单独的子包,并使用如上所示的相互依赖。

答案 2 :(得分:1)

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

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;

use Types;声明后,您甚至可以Misc.Types