我正在尝试了解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
否?另外,如何初始化这些变量?
答案 0 :(得分:1)
像m
和s
这样的变量是由类型定义的。在这种情况下,两种类型都源自real
类型。这称为type alias
。它们在类型和分配方面都是兼容的。
如果要使用不同的类型(在Freepascal和delphi中),请定义:
type Seconds = type real;
那将使打印过程仅接受Seconds
类型的参数。请注意,声明为不同类型的Seconds
和Meters
变量仍然与分配兼容。
要初始化变量,只需分配一个值即可:
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;
其中,实型是实际的实型。