在Pascal中使用TYPE关键字

在Pascal中使用TYPE关键字,pascal,Pascal,我试图理解pascal中关键字TYPE的定义。我知道C中的typedef只是给类型起了一个新名称(alasing)。但据我所知,Pascal中的TYPE并不是这样工作的。它将创建一个新的唯一类型 我试图搜索并创建一个简单的示例,显示TYPE的机制。我试图创建一个创建一些类型和函数的示例。之后,每次它都将其中一个类型传递给该函数。它应该失败,因为函数应该只获得一个类型,这证明了这些类型不仅仅是别名。由于我缺乏帕斯卡语法的知识,我每次都失败了 你能分享一个简单的简短程序来证明类型的威力吗 编辑: 我

我试图理解pascal中关键字
TYPE
的定义。我知道C中的
typedef
只是给类型起了一个新名称(alasing)。但据我所知,Pascal中的
TYPE
并不是这样工作的。它将创建一个新的唯一类型

我试图搜索并创建一个简单的示例,显示
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
否?另外,如何初始化这些变量?

m
s
这样的变量是由类型定义的。在这种情况下,这两种类型都源自
real
类型。这称为
类型别名
。它们作为类型和赋值都是兼容的

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

type Seconds = type real; 
这将使打印过程只接受
Seconds
type参数。请注意,声明为不同类型的
Seconds
Meters
变量仍然与赋值兼容

要初始化变量,只需指定一个值:

s := 42.0;


注意:大多数类型都以
T
开头命名。如
t秒
。只是为了将它们与变量区分开来。这是一种常见的约定(在pascal中)。

首先,在pascal中,关键字类型不创建类型。关键字TYPE必须出现在类型定义之前,但可以创建类型的是类型定义。并非所有类型定义都创建类型

Pascal标准规定如下:

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,因此米和秒都是Real的别名

是的,在Pascal中,Real不是一个类型,它是Real类型的内置类型标识符

帕斯卡标准说

所需类型标识符real应表示实际类型

因此,real实际上是一个类型标识符,而不是一个类型。似乎存在一个不可见的类型定义

TYPE
    Real = real-type;

其中实型就是实型。

@MartynA我正在学习PLs的概念。我只是想理解
TYPE
的概念,以及为什么它不是
alasing
@MartynA请查看我的示例。请注意,pascal中的类型系统比C演化得多。碰巧你触发了一个简便的“别名”,但试着定义一个真正不同的类型,如
(红心、黑桃、钻石、梅花)
(这是一个枚举).ISTM表示,
typeA=typeB;
不适用于所有Pascal。仅适用于、AFAIK、Delphi和FreePascal。t前缀约定也适用于Delphi/FreePascal,而不适用于Pascal。后来Turbo Pascal至少在任何地方都有t符号。可能是因为Turbo Vision与C进行了移植/代码共享。@Marco:Turbo Pascal不是general Pascal。除了Turbo Pascal、Delphi或FreePascal或compatibles(PascalScript等)之外,还有其他Pascal实现。我知道(FPC-Miso,记得吗?)。只是想确保包含TP,因为即使是现在,它的使用可能仍然比其他组合的要小。