1.1 C/C++ types to Ada types.
本节尝试展示如何将C/C++类型声名移动到Ada程序中并且帮助你理解Ada代码。节1.1.8介绍了一些Ada具体的你可以用于位域、类型替代与类型尺寸等的高级主题与诀窍
注意,对象被定义为与C/C++的位置相反,对象名字在前面,(然后一个冒号),接着是对象类型,像在C/C++中那样你可以声名多个对象,它们之间用逗号隔开。
// C/C++ 对象声名
int i;
int a, b, c;
int j = 0;
int k, l = 1;
int k=1,l=2; // C/C++可以为每个对象单独赋值
-- Ada对象声名
i : Integer;
a, b, c : Integer;
j : Integer := 0;
k, l : Integer := 1; -- Ada中只能统一赋值,要赋不同的值,那必须分开声名
前三个声名是一样的,它们生成一样的对象,第三个声名都是把j赋值为0 。然而第四个例子,C中K没有赋值、l赋值为1,而在Ada例子中它很清楚的K与l都被赋值为1。
另外的不同是定义常量。
// C/C++常量声名
const int days_per_week = 7;
-- Ada常量声名
days_per_week : constant Integer := 7;
days_per_week : constant := 7;
在Ada例程中,它可以只使用constant,不用类型来声名一个对象,编译器会选择最恰当的类型来代替它。
1.1.1 声名新类型与子类型.
之前我们挖掘Ada预定义类型的描述,这对向你们展示Ada如何定义一个类型非常重要。
Ada是一门强类型语言,实际上可能是最强的。这意味着它的类型模型是严格并绝对确定的。在C中用typedef来定义一个新名称来作为一个新的类型,想象一下,若类型的C甚至C++意味着我们实际上只是发明了一个低劣的同义词而已。思考:
typedef int INT;
INT a;
int b;
a = b; // 工作正常,没问题
编译器知道它们都是整数。 现在思考:
type INT is new Integer;
a : INT;
b : Integer;
a := b; -- 赋值失败。
这里很重要的关键词是new ,它概括了Ada处理那行语句的方式,它可以读为“一个新的类型INT已经从类型Integer中创建了”,而在C中,只是“一个新的名字INT作为int的别名”。
这个强类型可能产生一个困难,因此Ada也提供了一个特性来减少新类型与父类型之间的距离,思考:
subtype INT is Integer;
a : INT;
b : Integer;
a := b; -- works.
这里最重要的特性是子类型被通过某种方式强制为父类型,例如来指定一个整数值的上下边界(见以下关于范围的章节)
1.1.2 简单类型、整数和字符.
我们已经在上面看到了整数(Integer)类型,Ada中还有不少的类型,列出如下:
有符号整数 Integer, Long_Integer 等
任何的Ada编译器必须提供整数类型,这是一个有符号整数,并且贯彻定义的大小。编译器也可以自由的提供Long_Integer,Short_Integer,Long_Long_Integer等需要的类型。
无符号整数
Ada没有一个定义的无符号整数,因此可以通过一个范围类型来合成(见节1.1.5),Ada-95有一个定义的包,System.Unsigned_Types,它提供了一组无符号类型(的定义)。
Ada-95已经提供了一个余数类型(modular type)来指定最大值,也因此在算术上有循环的特性,下溢/上溢是不可能发生的。这意味着如果你有一个具有值0到255的余数类型,并且它的当前值是255,如果它增加1,它则会又变成0 。用在以下章节1.1.5中的范围类型(之前用于定义无符号整数)来作比较。这样的类型定义定义形式为:
type BYTE is mod 256;
type BYTE is mod 2**8;
第一个简单的指定了最大值,第二个用了一个更规范的方式来指定它,2**x形式经常用于系统编程来指定位掩码类型 。注意:这并不要求一定使用2**x形式,你可以使用任意的值,因此10**10也是合法的。
字符 Character{3.5.2}
这与C中的char类型非常类似,也拥有ASCII字符集。然而,它实际上定义在包Standard{A.1}中作为一个枚举类型(见章节1.1.5)。Ada中有个包Ada.Characters.Handling定义了与C中ctype.h中函数集等价的功能。
Ada Also defines a Wide_Character
type for handling non ASCII character sets.
Ada也定义了一个宽字类型(Wide_Character)来处理非ASCII字符集。
布尔 Boolean {3.5.3}
它也定义在包Standard中,作为一个枚举类型(见以下)包含(FALSE,TRUE)。
1.1.3 Strings. {3.6.3}