2

我想声明一些“用户定义的编译器常量”以使我的规范文件尽可能地保持“常量”。这在 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 中做一些具有相同结果的事情?

4

3 回答 3

3

我认为这是从您的 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;.

于 2012-05-09T12:17:31.153 回答
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.

于 2012-05-04T06:34:12.853 回答
1

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

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

举个例子,固然可笑;让我们使用钢笔和墨盒。

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并使用如上所示的相互关联。

于 2012-05-03T16:17:30.927 回答