Разница заключается в том, где вам разрешено ссылаться на то, что AConsts
имеет в своем разделе интерфейса. В первом AUnit
вы могли бы использовать Const4
для объявления массива фиксированного размера в этом разделе интерфейса. Вы не могли бы сделать это во втором AUnit
, потому что Const4
не находится в области видимости.
Это может повлиять на скомпилированную программу, если вы не будете осторожны. Предположим, что у нас есть другая единица, которая также объявляет константу с именем Const4
:
unit BConsts;
interface
const
Const4 = 50;
implementation
end.
Теперь мы определим массив в UnitA
следующим образом:
unit AUnit
interface
uses BConsts;
var
data: array[0..Pred(Const4)] of Integer;
implementation
uses AConsts;
procedure Work;
var
i: Integer;
begin
for i := 0 to Const4 - 1 do begin
data[i] := 8;
end;
end;
end.
Этот код будет записываться после конца массива, потому что Const4
, который находится в области действия в разделе интерфейса, не совпадает с Const4
, который используется в разделе реализации. Это не часто случается с константами. Обычно это происходит с двумя идентификаторами: функцией FindClose
, определенной в Windows
и SysUtils
, и TBitmap
, определенной в Graphics
и Windows
. И в этих двух случаях компилятор скажет вам, что вы сделали что-то не так, хотя он не скажет вам точно, что вы использовали идентификатор, который имеет два разных значения. Вы можете решить проблему, указав идентификатор:
for i := 0 to BConsts.Const4 - 1 do
data[i] := 8;
Если все вышеперечисленные меры предосторожности учтены, поэтому ваша программа компилируется и работает правильно, то не имеет значения, где используются единицы измерения. В вашем примере с App1 и App2 две программы будут одинаковыми. Они не будут идентичны - компилятор будет обрабатывать вещи в другом порядке и, таким образом, вероятно, будет размещать вещи в разных местах - но это не повлияет на выполнение вашей программы.