Различие между добавлением единицы к интерфейсу или разделу реализации

Если у меня есть единица, которая заполнена константами как...

unit AConsts;
interface
const
   Const1 : WideString = 'Const1';
   Const2 : WideString = 'Const2';
   Const3 : WideString = 'Const3';
   Const4 = 100;
   Const5 = 100;
implementation
end.

и я хочу использовать эту единицу от другой единицы, есть ли любое различие между...

unit AUnit;
interface
uses 
  AConsts;
Implementation
end.

и

unit AUnit;
interface
implementation
uses
  AConsts;
end.

?

Вопрос не об объеме, избегая циклических ссылок и т.д. Это о различиях в скомпилированном приложении.

Если UnitA, UnitB и UnitC все использование AConsts, там было бы различие в скомпилированном приложении (принимающий столкновения имени между константами в AConsts единица и другой код) между App1 где они UnitA, UnitB и UnitC все имеют AConsts в интерфейсном разделе и App2 где UnitA, UnitB и UnitC все имеют AConsts в разделе реализации.

6
задан Triber 9 July 2019 в 18:48
поделиться

5 ответов

Различие имеет отношение, где Вам разрешают отослать к вещам это 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, эти две программы будут тем же. Они не будут идентичны — компилятор обработает вещи в другом порядке и таким образом вероятно, поместит вещи в различные места — но он не будет иметь никакого эффекта на осуществление Вашей программы.

10
ответ дан 8 December 2019 в 13:50
поделиться

Я поместил все ссылки в раздел реализации и только поставил те имена единицы в интерфейсе, к которому я имею.

Мне нравится ограничивать объем всего как можно больше, тем не менее, и эта политика в соответствии с этим.

3
ответ дан 8 December 2019 в 13:50
поделиться

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

Если Ваш интерфейсный раздел будет использовать UnitA, и Ваш раздел реализации использует UnitB затем, если единица B перекомпиляция потребностей, Ваша единица не будет, но если Унита изменится затем, то Ваша единица должна будет быть перекомпилирована.

Это - один из секретов Delphis супер быстрая скорость сборки.

Относительно Вашего законченного исполняемого файла, я ожидаю, что это окажется тем же размером везде, куда Вы помещаете объявления (компоновщик умен и только связывается в методах и т.д., которые на самом деле используются Вашим приложением), но фактическое местоположение различных источников почти наверняка изменилось бы, если порядок объявлений единицы изменяется.

2
ответ дан 8 December 2019 в 13:50
поделиться

Я следую правилу, что я поместил все на Интерфейсную часть, если я не должен иметь дело с проблемами с циклическими ссылками. Это помогает принести немного ясности. Некоторые мастера в Delphi и "Файле> Единица Использования..." диалоговое окно помещают единицы на раздел реализации.

За исключением прерываний обзора, которые выделенный Rob Kennedy, это, не имеет значения. Сделайте свой стандарт и придерживайтесь его.

1
ответ дан 8 December 2019 в 13:50
поделиться

Объекты в операторе использования в интерфейсе видимы во всей единице.

Объекты в операторе использования в реализации только видимы в разделе реализации.

Пример:

unit A;
interface
const 
  cA = 1;
..


unit B;
interface
const 
  cB = 1;
..



unit C;
interface
uses
  A;
const 
  cC1 = cA;
  cC2 = cB; // Error

implementation
uses
  B;
const
  cC3 = cA;
  cC4 = cB;

end.

Можно создать взаимные зависимые единицы, если по крайней мере одна единица включена в раздел реализации:

unit A;
interface
implementation
uses
  B;
end.


unit B;
interface
implementation
uses
  A;
end.

Если оба будут использоваться в интерфейсном разделе, то он не будет компилировать/связывать.

1
ответ дан 8 December 2019 в 13:50
поделиться