我想声明一些“用户定义的编译器常量”,以使我的规范文件尽可能保持“常量”。这在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是一个上下文,我的问题是:如何在keyword...hence中做一些同样的事情呢?
发布于 2012-05-09 20:17:31
我认为这是从你的C++到Ada的一个合理的映射:
首先,我认为在文件misc.ads中,或多或少地对应于您的namespace misc,
package Misc is
end Misc;然后,在文件misc-config.ads中,对应于config.hh,
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,
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;。
发布于 2012-05-04 00:17:31
好吧,虽然我知道你在尝试做什么,但你做错了。给定的sniplet的问题是:循环依赖。
现在,Ada有一个很好的方法来管理循环依赖,通过使用specs和by使其成为非循环的(在某种意义上)。由于两者是离散的,我们可以有两组规范/主体文件,其中主体精确地引用另一个规范,因为规范是公开可见的。
举个例子,无可否认是荒谬的;让我们使用钢笔和墨盒。
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,并使用如上所示的mutual withing。
发布于 2012-05-04 14:34:13
您可以将子包规范放在父包规范中,如下所示:
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;。
https://stackoverflow.com/questions/10434117
复制相似问题