6.9.2. Опережающее описание процедур и функций
Текст программы транслируется в выполнимый код последовательно сверху вниз. При этом переменные, типы, константы и подпрограммы должны описываться до того, как начнутся их упоминания в операторах или выражениях. В противном случае компилятор объявит имя неизвестным, и придется перемещать описания подпрограмм вверх по тексту программы. В случаях с процедурами и функциями этого можно избежать, используя опережающее описание директивой FORWARD:
PROCEDURE ИмяПроцедуры(параметры); FORWARD;
FUNCTION ИмяФункции( параметры ) : ТипЗначения; FORWARD;
......
PROCEDURE ИмяПроцедуры; { список параметров уже не нужен }
Тело процедуры
FUNCTION ИмяФункции; { достаточно указать только имя }
Тело функции
......
Эта директива объявляет заголовок подпрограммы, откладывая описание содержимого «на потом». Местоположение этого описания уже не играет роли, и в нем можно не указывать параметры, а ограничиться лишь именем подпрограммы. Основное описание не может иметь никаких директив (FORWARD, EXTERNAL и др.).
Директива FORWARD существует в языке в основном для развязки закольцованных вызовов. Так, ситуацию на рис. 6.9 можно разрешить только с ее помощью:
PROCEDURE a( у : TypeXY ); FORWARD;
PROCEDURE b( x : TypeXY );
BEGIN
...
a(p); {процедура b вызывает a}
END;
PROCEDURE a;
BEGIN
...
b( q ); {но сама a вызывает b }
END;
Рис. 6.9
- 113 -