delphi – 向Interface使用子句而不是Implementation uses子句添加单元

前端之家收集整理的这篇文章主要介绍了delphi – 向Interface使用子句而不是Implementation uses子句添加单元前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当使用Delphi时:如果我有一个充满常量的单元,比如…
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.


或者换句话说,就编译的应用程序而言,两者之间是否存在差异?

[编辑1]

谢谢你到目前为止的答案.

我没有把这个问题弄清楚,为此我道歉.问题不在于范围,避免循环引用等.它是关于编译应用程序的差异.也许另一个例子会有帮助.

如果UnitA,UnitB和UnitC都使用AConsts,那么在App1之间编译应用程序(假设AConsts单元和其他代码中的常量之间没有名称冲突)会有区别,其中这些UnitA,UnitB和UnitC都在接口中有AConsts section的uses子句和App2,其中UnitA,UnitB和UnitC都在Implementation部分的uses子句中都有AConsts.

解决方法

区别在于您可以在其接口部分中引用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不同.常量常常不会发生这种情况.它通常只发生两个标识符,Windows和SysUtils中定义的FindClose函数,以及在Graphics和Windows中定义的TBitmap.在这两种情况下,编译器会告诉你,你做错了什么,虽然它不能准确地告诉你你已经使用了具有两种不同含义的标识符.您可以通过限定标识符来解决问题:

for i := 0 to BConsts.Const4 - 1 do
  data[i] := 8;

如果解决了上述所有注意事项,那么您的程序将编译并正确运行,那么在使用单位时没有任何区别.在您的App1和App2示例中,两个程序将是相同的.它们将不相同 – 编译器将以不同的顺序处理事物,因此可能将事物放在不同的位置 – 但它对程序的执行没有影响.

猜你在找的Delphi相关文章