Ada 编程/库/标准
标准包是隐式的。这意味着两件事
- 你不需要
with
或use
该包,事实上你不能 (见下文)。它总是可用的 (除非被同名词隐藏,RM 8.3 (8) (带注释的)). - 标准可能包含并非完全合法的 Ada 结构 (例如 Character 和 Wide_Character 的定义).
一个with
子句提及标准引用一个用户定义的包标准隐藏了预定义的包。所以不要这样做。但是任何被同名词隐藏的库单元可以通过使用限定名再次使其可见标准,例如Standard.My_Unit.
由于该包标准对于可移植性非常重要,这里有一些针对各种编译器的示例
- 来自 ISO 8652 的包 标准。
- 来自 GNAT 的包 标准。
- 来自 Rational Apex 的包 标准。
- 来自 ObjectAda 的包 标准
- 用于 AppletMagic 的 标准 定义
标准中唯一强制的类型是 Boolean、Integer 及其子类型、Float、Character、Wide_Character、Wide_Wide_Character、String、Wide_String、Wide_Wide_String、Duration。在 RM A.1 [带注释的](51) 中有一个实现许可,可能存在更多整数和浮点类型,以及关于所选名称的实现建议 RM A.1 [带注释的](52)。甚至没有要求这些附加类型必须具有不同的大小。因此,例如,实现提供两个类型 Long_Integer 和 Long_Long_Integer 是合法的,它们都具有相同的范围和大小。
请注意,数值类型的范围和大小在每个平台上可能不同。有一个实现要求,即类型 Integer 的大小至少为 16 位,Long_Integer 的大小至少为 32 位(如果存在)RM 3.5.4 [带注释的](21..22)。还有一个实现许可 RM 3.5.4 [带注释的](25),指示较小范围的类型的其他类型,例如 Short_Integer(如果存在),实际上没有大于指示更大范围的范围。但是,有一个实现建议 RM 3.5.4 [带注释的](28),标准中不应该存在除 Integer 和 Long_Integer 之外的其他整数类型;相反,这些适应硬件的类型应该在包 Interfaces RM B.2 [带注释的] 中定义。因此,如果您希望您的类型具有完全的可移植性,请不要使用标准中的类型 (除非您必须使用,见下文),而是定义您自己的类型。编译器将拒绝它无法满足范围的任何类型声明。
这意味着,例如,如果您需要一个 64 位类型,并且发现您当前的实现 Standard.Long_Long_Integer 是这样一个类型,那么当将您的程序移植到另一个实现时,该类型可能更短,但编译器不会告诉您 - 并且您的程序很可能会崩溃。但是,当您定义自己的类型,例如
type
My_Integer_64is
range
-(2**63) .. +(2**63 - 1);
那么,当移植到无法满足此范围的实现时,编译器将拒绝您的程序。
当您使用 [[宽] 宽] 字符串或指数 x**i 时,类型 Integer 是强制性的。这就是为什么一些项目甚至定义了自己的字符串,但这意味着将孩子和洗澡水一起倒掉。通常,将 Integer 与字符串和指数一起使用不会导致可移植性问题。
- A.1:标准包 [带注释的]
- 3.5.4:整数类型 [带注释的]
- 3.5.7:浮点类型 [带注释的]
- 7.1.1 过时的特性 - 避免使用包 ASCII
- 7.2.1 预定义数值类型 - 避免使用预定义数值类型