Если строго следовать правилу, согласно которому каждый идентификатор перед употреблением должен быть описан, то следующую программную конструкцию, при которой подпрограмма вызывает следующую за ней, использовать нельзя:
ProcedureA (i:integer);
Begin
B(i); {!!! вызов еще не описанной процедуры}
end;
ProcedureB (i:integer);
Begin
A(i);
end;
Для того, чтобы такие вызовы стали возможны, вводится опережающее описание. Опережающее описание заключается в том, что до описания процедуры A объявляется лишь заголовок процедуры В, а ее тело заменяется стандартной директивой forward, указывающей, что тело процедуры будет описано далее. При таком описании в процедуре A можно использовать обращение к процедуре В, так как уже описаны ее формальные параметры, и компилятор может правильным образом организовать ее вызов. При использовании опережающего описания тело процедуры В будет начинаться заголовком, в котором уже не указываются описанные ранее формальные параметры. Для рассмотренного выше примера следует программный код организовать следующим образом:
ProcedureB (i:integer); forward;
ProcedureA (i:integer);
Begin
B(i); {вызов процедуры с опережающим описанием}
end;
ProcedureB;
Begin
A(i);
end;