C语言中的typedef和Ada中的应用程序定义类型之间的区别

3

我正在学习Ada语言中的应用程序定义类型,它似乎与C编程语言中的typedef相似。但是,如果我在C中使用typedef为预定义类型创建了一个新名称,则仍然可以执行以下操作:

typedef int my_int;
int a = 5;
my_int b = a; -- No problem

但如果我在 Ada 上尝试这样做:

type my_int is new Integer;
a : Integer := 5;
b : my_int  := a; -- Causes some error

那么我的问题是,在C语言中,my_int只是类型int的别名或新名称,而不是新类型;而在Ada语言中,my_int是完全不同的数据类型,而不仅仅是类型Integer的新名称。

2
维基百科上甚至有一个完全相同的例子:https://en.wikibooks.org/wiki/Ada_Programming/Type_System#Derived_types - KamilCuk
我认为你要找的是 subtype my_int is Integer; - Zerte
2个回答

3
首先,在Ada中声明类型并不同于C中的 typedeftypedef 更像是创建一个现有简单类型的别名。 在Ada中正确的方法是声明一个子类型(subtype)。在你的例子中应该这样做(如Zerte在评论中建议的那样):
subtype my_int is Integer;

在这种情况下,您的代码将起作用。顺便说一句:在Ada中创建记录与使用typedef创建结构体在C语言中非常相似。
Ada是一种强类型语言。一个类型不能被分配给另一个类型而不进行类型转换(在C家族语言中称为“强制类型转换”)。例如:
type My_Int is new Integer;
type My_Int2 is new Integer;

这两种类型与其父类型Integer不兼容,如果你想混合使用它们,就必须使用类型转换。

作为一个从C语言转到Ada语言的人,我认为,如果你想理解Ada,最重要的是要理解Ada类型系统。这与C完全不同。C更注重数据操作,而Ada更注重数据表示。


2
这是我最喜欢的一个。在 C 语言中,大约有 20% 的代码是静态检查的,而有 80% 的代码是动态检查的。而在 Ada 语言中,大约有 80% 的代码是静态检查的,而有 20% 的代码是动态检查的。 - Anh Vo
@AnhVo:我同意。 :) - thindil

2
这是我的理解,C语言中的my_int只是int类型的别名或新名称,而不是新类型,而在Ada中,my_int则是完全不同的数据类型本身,而不仅仅是Integer类型的新名称。
这种表述有点模糊,但是否为新类型并不重要 - 在C语言中,您也可以使用char c = 1.123L;而没有任何问题。区别在于,C语言在此上下文中具有隐式转换 - 而Ada则没有。总的来说,这些是不同的编程语言。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接