6

我已经为 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”关键字的?与每种类型有一个“类型”相比,在一个“类型”关键字下声明多个类型的语法含义是什么?好吧,这很令人困惑,但我希望代码示例有助于解释我的意思。我在德尔福 2007 年工作。

4

3 回答 3

9

type当代码已经是现有类型声明部分的一部分时,逻辑上不需要使用关键字。所以,

type
  TRec1 = record
  end;

  TRec2 = record
  end;

产生无法区分的类型

type
  TRec1 = record
  end;

type
  TRec2 = record
  end;

但是,正如您所发现的,编译器有一个限制,即要求在引入前向声明的部分结束之前完全解析所有前向声明。

没有什么特别的理由必须这样。编译器完全有可能放宽这个限制。只能假设可能源自很久以前的编译器实现细节已泄漏到语言规范中。

于 2013-03-11T10:49:39.480 回答
2

这个纯粹的标准帕斯卡。由于 Pascal 编译器通常是一次性的并且没有类型的前向声明,因此 N. Wirth 在原始 Pascal 中定义了此功能,以允许将此类“递归”类型用于例如链表等。

于 2013-03-11T14:48:21.963 回答
0

我已经发表了评论,但需要同行评审。这个比较有效。因此,这是另一个答案。这可以合并或任何你想要的。

在“算法 + 数据结构 = 程序”中,Wirth 在“程序 4.1 直列表插入”中给出了一个示例

type
  ref  = ^word;
  word = record
           key: integer;
           count: integer;
           next: ref
         end;
于 2013-03-12T10:54:42.657 回答