6

私は Delphi のプログラミングを 5 ~ 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;

「type」キーワードは Delphi でどのように処理されますか? タイプごとに1つの「タイプ」を持つのと比較して、1つの「タイプ」キーワードで複数のタイプを宣言することの構文上の意味は何ですか? わかりにくいかもしれませんが、コード例が私の言いたいことを説明するのに役立つことを願っています. 私は Delphi 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 コンパイラは通常 1 パスであり、型の前方宣言がないため、この機能は元の Pascal で N. Wirth によって定義され、たとえば連結リストなどにそのような「再帰」型を許可しました。

于 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 に答える