【问题标题】:Ada type declaration in CC中的Ada类型声明
【发布时间】:2021-11-14 12:34:51
【问题描述】:

有没有办法在 C 中声明一个新的整数类型?

在艾达,

type a is new integer;

表示a不等于说,一个整数变量x。

我知道typedef可以创建整数的别名,但是和上面的Ada代码不一样。它更像是 Ada 中的一个子类型。

有人知道吗?

【问题讨论】:

  • 不,你不能像这样在 C 中创建新类型。正如您所指出的,Typedef 只是别名。作为用户,您可以创建的唯一类型是结构、联合和枚举,而这些显然不是简单的整数类型。你可以做struct myint { int i; };,这将创建一个用户定义的类型,能够存储一个int,并且具有与int相同的大小,但它不会太有用,因为你不能,喜欢,对它做算术或任何事情。
  • 你为什么要那个?

标签: c ada


【解决方案1】:

C 和 Ada 中的类型系统不同。

C 对原始类型使用结构类型系统,对结构和联合使用主格类型系统。 C 枚举只是命名为整数值,而不是独立于 int 的类型。由于 C 中的所有 int 实例在给定硬件平台上都具有相同的结构表示,因此 int 的所有 typedef 都是相同的类型。

Ada 对所有类型都使用主格类型系统。类型通过它们的名称而不是它们的结构布局来区分。因此类型 Integer 不同于

type My_Int is new Integer;

My_Int 是一种名称与 Integer 不同的类型,即使它是从 Integer 派生的。因此 My_Int 不是 Ada 中的 Integer,即使这两种类型共享相同的操作和相同的内存布局。

C typedef 类似于 Ada 子类型,因为子类型是其父类型的成员。子类型和 typedef 不同,因为标量类型的子类型可以定义为有限范围,例如:

subtype Natural is Integer range 0..Integer'Last;
subtype Positive is Integer range 1..Integer'Last;

Natural 或 Positive 的每个实例都是一个整数值。与其基类型相比,子类型的有效值范围有限。

C 中的 typedef 语句没有简单的方法可以声明一个受限制的值范围。 C 标准委员会过去曾拒绝过类似的提案。

【讨论】:

  • 如果你想迷惑读者,你可以说type Integer is new Standard.Integer;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多