我一直在为Delphi编程五六年,我认为自己相当擅长,但我最近偶然发现了一个我无法解释的行为。我正在编写一个简单的链表,我们称之为TIntegerList。下面的示例代码正确编译:
type
PIntegerValue = ^TIntegerValue;
TIntegerValue = record
Value: Integer;
Next: PIntegerValue;
Prev: PIntegerValue;
end;
但是,下面的代码没有(说TIntegerValue未声明):
type
PIntegerValue = ^TIntegerValue;
type
TIntegerValue = record
Value: Integer;
Next: PIntegerValue;
Prev: PIntegerValue;
end;
Delphi中处理“type”关键字的确切方式是什么?与在每个类型中使用一个“类型”相比,在一个“type”关键字下声明多个类型的语法含义是什么?好吧,这令人困惑,但我希望代码示例有助于解释我的意思。我在Delphi 2007工作。
答案 0 :(得分:9)
逻辑上,当代码已经是现有类型声明部分的一部分时,不需要使用type
关键字。所以,
type
TRec1 = record
end;
TRec2 = record
end;
生成与
无法区分的类型type
TRec1 = record
end;
type
TRec2 = record
end;
但是,正如您所发现的那样,编译器有一个限制,要求在引入前向声明的部分结束之前完全解析所有前向声明。
没有特别的理由必须这样。编译器完全可以放宽该限制。人们只能假设很可能源于很久以前的编译器实现细节已经渗透到语言规范中。
答案 1 :(得分:2)
这是纯粹的标准Pascal。由于Pascal编译器通常是单通道的,并且没有类型的前向声明,因此在N.Wirth的原始Pascal中定义了此功能,以允许这样的“递归”##例如,类型链表等。
答案 2 :(得分:0)
我已经发表评论,但要进行同行评审。这相当有效。因此,这是另一个答案。这可以合并或任何你想要的。
在“算法+数据结构=程序”中,Wirth在“程序4.1直接列表插入”中给出了一个例子
type
ref = ^word;
word = record
key: integer;
count: integer;
next: ref
end;