我想声明一些“用户定义的编译器常量”,以使我的规范文件尽可能保持“常量”。这在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中做同样结果的事情呢?
答案 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;
(未编译。) 我忘了如何创建一个循环嵌套类型的组件,但是......无论如何,你应该在那里得到一般的想法。但是你想要的是根本不同于相互依赖的类型;你想要的是你的常数的某种容器。
我建议使用子包。像Misc
和Misc.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
。