首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将单元添加到接口或实现部分之间的区别

将单元添加到接口或实现部分之间的区别
EN

Stack Overflow用户
提问于 2009-02-09 14:57:27
回答 5查看 5.4K关注 0票数 7

如果我有一个充满常量的单位.

代码语言:javascript
复制
unit AConsts;
interface
const
   Const1 : WideString = 'Const1';
   Const2 : WideString = 'Const2';
   Const3 : WideString = 'Const3';
   Const4 = 100;
   Const5 = 100;
implementation
end.

我想用另一个单位的单位,有什么区别吗.

代码语言:javascript
复制
unit AUnit;
interface
uses 
  AConsts;
Implementation
end.

代码语言:javascript
复制
unit AUnit;
interface
implementation
uses
  AConsts;
end.

问题不在于范围、避免循环引用等,而在于编译后的应用程序的差异。

如果implementation部分中UnitAUnitBUnitC都使用AConsts,那么在E 113接口<代码>E 214部分和UnitAUnitBAConstsAConsts部分中,这些UnitAUnitBUnitC都具有D12和D19的App1之间的差异(假设AConsts单元中的常量与其他代码之间没有名称冲突)。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-02-09 15:02:01

这种区别与您可以引用AConsts在其接口部分中的内容有关。在第一个AUnit中,可以使用Const4在接口部分声明一个固定大小的数组。您不能在第二个AUnit中这样做,因为Const4不在范围内。

如果你不小心的话,它会对编译的程序产生影响。假设我们有另一个单元,它也声明一个名为Const4的常量

代码语言:javascript
复制
unit BConsts;
interface
const
  Const4 = 50;
implementation
end.

现在我们在UnitA中定义一个数组,如下所示:

代码语言:javascript
复制
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不同。这种情况在常量中并不经常发生。这种情况通常只发生在两个标识符上,即在FindCloseSysUtils中定义的Windows函数,以及在GraphicsWindows中定义的TBitmap。在这两种情况下,编译器会告诉您您做错了什么,尽管它不会准确地告诉您您使用了一个具有两种不同含义的标识符。您可以通过限定标识符来解决这个问题:

代码语言:javascript
复制
for i := 0 to BConsts.Const4 - 1 do
  data[i] := 8;

如果上述所有预防措施都得到了解决,那么您的程序就会正确编译和运行,那么使用单元的位置就没有什么不同了。在使用App1和App2的示例中,这两个程序将是相同的。它们不会相同--编译器将以不同的顺序处理事情,因此可能会把事情放在不同的地方--但是它不会对程序的执行产生任何影响。

票数 10
EN

Stack Overflow用户

发布于 2009-02-10 01:14:29

我在实现部分中放置了所有引用,并且只将那些单元名称放在我必须使用的接口中。

不过,我喜欢尽可能地限制每件事的范围,而这项政策正是根据这一点制定的。

票数 3
EN

Stack Overflow用户

发布于 2009-02-09 17:01:56

IDE还使用声明使用的位置来确定需要编译什么。

如果您的接口部分使用UnitA,而您的实现部分使用UnitB,那么如果单元B需要重新编译,那么您的单元就不需要重新编译,但是如果unitA更改了,那么您的单元就需要重新编译。

这是德尔菲超高速建造速度的秘密之一。

至于您已完成的可执行文件,我希望无论您将声明放在何处(链接器很聪明,只有应用程序实际使用的方法等中的链接),它的大小都是相同的,但是如果更改单元声明的顺序,那么各种源的实际位置几乎肯定会发生变化。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/528472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档