3.5 Предварительное описания типа

На верх  Назад  Вперёд

Программы иногда должны поддерживать связанный список записей. Каждая запись содержит указатель на следующую запись (и возможно на предыдущую запись). Для безопасности типов, лучше определять этот указатель как типизированный указатель, таким образом, память под следующую запись может быть выделена в куче, используя вызов New. Для того, чтобы сделать это, запись должна быть определена примерно так:

Type

TListItem = Record

  Data : Integer;

  Next : ^TListItem;

end;

При попытке скомпилировать это, компилятор, при нахождении объявления переменной Next, будет жаловаться, что тип TListItem еще не определен: Это корректно, не смотря на то, что объявление типа все еще анализируется.

Чтобы иметь возможность использовать элемент Next как типизированный указатель, нужно использовать 3.5 Предварительное описания типа:

Type

PListItem = ^TListItem;

TListItem = Record

  Data : Integer;

  Next : PTListItem;

end;

Когда компилятор встречается с объявлением типизированного указателя, где тип, на который ссылаются, еще не известен, он откладывает связывание ссылки на потом. Объявление указателя это 3.5 Предварительное описания типа.

Тип, на который ссылаются, должен быть объявлен позже в том же самом блоке Type. Блок не может прерываться (не должно быть других блоков между определением типизированного указателя и типом, на который ссылаются). Даже слово Type не может использоваться повторно: т.к оно начнет новый блок описания типа (Type), заставляя компилятор связать все ожидающие связывания объявления в текущем блоке.

В большинстве случаев, объявление ссылочного типа следует сразу после определения типа указателя, как показано в приведенном выше листинге. Предварительно описанный тип может быть использован в любом объявлении типа после его описания.

Отметим, что предварительное описание типа возможно только с типами указателей и классов, но не с другими типами.