在Pascal中使用TYPE关键字

时间:2019-01-25 18:06:33

标签: pascal

我正在尝试了解pascal中关键字TYPE的定义。我知道C中的typedef只是为该类型赋予了一个新名称(疏散)。但是据我了解,Pascal中的TYPE不能那样工作。它将创建一个新的唯一类型。

我正在尝试搜索并创建一个简单的示例,以显示TYPE的机制。我试图创建一个示例,该示例创建一些类型和一个函数。之后,每次将其中一种类型传递给该函数。它应该失败,因为该函数只能获得一种类型,这证明这些类型不仅仅是别名。由于缺乏对Pascal语法的了解,所以每次都失败。

您可以共享一个简单的简短程序来证明TYPE的功能吗?

编辑

我创建了以下示例:

program Check;
TYPE
    Meters = Real; Seconds = Real;

VAR
    m: Meters; s: Seconds;

Procedure PRINT_SEC(s: Seconds);
    Begin
        WriteLn(s, ' sec');
    end;

Begin
    PRINT_SEC(s);
    PRINT_SEC(m);
end.

输出:

0.0000000000000000E+000 sec
0.0000000000000000E+000 sec

但是为什么它不会失败?我通过了m类型的Meters否?另外,如何初始化这些变量?

2 个答案:

答案 0 :(得分:1)

ms这样的变量是由类型定义的。在这种情况下,两种类型都源自real类型。这称为type alias。它们在类型和分配方面都是兼容的。

如果要使用不同的类型(在Freepascal和delphi中),请定义:

type Seconds = type real; 

那将使打印过程仅接受Seconds类型的参数。请注意,声明为不同类型的SecondsMeters变量仍然与分配兼容。

要初始化变量,只需分配一个值即可:

s := 42.0;

注意:大多数类型都以T开头。像TSeconds。只是为了将它们与变量区分开。这是一个常见的约定(以帕斯卡为单位)。

答案 1 :(得分:1)

首先要注意的一点是,在Pascal中,关键字TYPE不会创建类型。关键字TYPE必须在类型定义之前出现,但这是可以创建类型的类型定义。并非所有类型定义都创建类型。

《帕斯卡标准》(Pascal Standard)指出:

A type-definition shall introduce an identifier to denote a type.

这意味着类型定义会引入(即创建或重新定义)一个表示类型的标识符(即是该类型的别名)。

Pascal标准将类型定义定义为:

type-definition = identifier '=' type-denoter

type-denoter = type-identifier | new-type

new-type = new-ordinal-type | new-structured-type | new-pointer-type

这意味着类型定义是一个标识符,后跟等号,后跟一个类型表示符。类型标示符可以是类型标识符,也可以是新类型。

因此类型标识符引入了一个标识符,该标识符表示另一个类型标识符或新类型(即为其别名)。仅当类型指示符是新类型时才创建类型。

在您的示例中:

TYPE
    Meters = Real; Seconds = Real;

两个类型定义中的类型表示符都是类型标识符Real,因此Meters和Seconds都是Real的别名。

是的,在Pascal中,实型不是类型,它是实型的内置类型标识符。

帕斯卡标准说

  

必需的类型标识符 real 表示实型。

所以 real 实际上是类型标识符,而不是类型。好像有一个不可见的类型定义。

TYPE
    Real = real-type;

其中,实型是实际的实型。