Я вижу, вы отметили свой вопрос [delphi]
, а также [pascal]
, так что, я полагаю, вы действительно пишете код Delphi. Затем у вас есть еще несколько вариантов, помимо заботы о порядке процедур и директиве forward
, обсуждаемой Дэвидом.
Чаще всего проект Delphi
(GUI или консоль) делится на «единицы». Типичный блок выглядит так:
unit MyUnit;
interface
const
RANDOM_NUMBER = 17;
var
PrintExtraNiceMessage: boolean;
procedure DoThis;
procedure DoThat;
implementation
const
BUFFER_SIZE = 256;
procedure InitSomething;
begin
// TODO: do some internal work...
end;
procedure DoThis;
begin
// TODO: do something
end;
procedure DoThat;
begin
// TODO: do something else
end;
Вы заметите, что устройство разделено на две части: часть interface
и часть implementation
. Часть interface
содержит только объявления (функций, процедур, типов, констант и переменных); объявленные здесь функции и процедуры определены (то есть реализованы) в разделе implementation
. Обратите внимание, что в разделе implementation
могут быть определены функции и процедуры, которые не имеют объявлений в разделе interface
.
Великая идея заключается в том, что содержимое раздела interface
видимо для всех других модулей вашей программы, тогда как содержимое раздела implementation
видно только внутри этого самого модуля. Так что любой другой модуль в вашей программе может использовать константу RANDOM_NUMBER
, переменную PrintExtraNiceMessage
и две процедуры DoThis
и DoThat
. Но вы можете использовать InitFunction
только в этой единице (например, внутри DoThis
или DoThat
). Кроме того, константа BUFFER_SIZE
также не видна вне этой самой единицы.
Это очень элегантный подход. В разделе interface
описано, как этот модуль используется в других модулях (например, какие функции существуют и как они используются), а подробности реализации «скрыты» в разделе implementation
.
Преимущество этого подхода в том, что он решает вашу проблему, по крайней мере, возможно. Если процедуры add
, multiply
, subtract
и divide
должны быть видны другим блокам, то они должны быть объявлены в разделе interface
. Но тогда они действительно будут известны компилятору к тому времени, когда он придет к вашей questiontype
процедуре, и поэтому вы можете использовать их вызов, даже если они определены (реализованы) ниже процедуры questiontype
в разделе implementation
. Но, с другой стороны, если вообще не имеет смысла позволять другим модулям использовать эти процедуры, то они не должны быть объявлены в разделе interface
, и вам нужно делать это, как предлагает Дэвид. Это также применимо, если в вашем проекте вообще нет нормальных единиц, то есть, если у вас есть только файл program
, который не делится на части interface
и implementation
.