如果我有一个充满常量的单位.
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.问题不在于范围、避免循环引用等,而在于编译后的应用程序的差异。
如果implementation部分中UnitA、UnitB和UnitC都使用AConsts,那么在E 113接口<代码>E 214部分和UnitA、UnitB和AConsts的AConsts部分中,这些UnitA、UnitB和UnitC都具有D12和D19的App1之间的差异(假设AConsts单元中的常量与其他代码之间没有名称冲突)。
发布于 2009-02-09 15:02:01
这种区别与您可以引用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和SysUtils中定义的Windows函数,以及在Graphics和Windows中定义的TBitmap。在这两种情况下,编译器会告诉您您做错了什么,尽管它不会准确地告诉您您使用了一个具有两种不同含义的标识符。您可以通过限定标识符来解决这个问题:
for i := 0 to BConsts.Const4 - 1 do
data[i] := 8;如果上述所有预防措施都得到了解决,那么您的程序就会正确编译和运行,那么使用单元的位置就没有什么不同了。在使用App1和App2的示例中,这两个程序将是相同的。它们不会相同--编译器将以不同的顺序处理事情,因此可能会把事情放在不同的地方--但是它不会对程序的执行产生任何影响。
发布于 2009-02-10 01:14:29
我在实现部分中放置了所有引用,并且只将那些单元名称放在我必须使用的接口中。
不过,我喜欢尽可能地限制每件事的范围,而这项政策正是根据这一点制定的。
发布于 2009-02-09 17:01:56
IDE还使用声明使用的位置来确定需要编译什么。
如果您的接口部分使用UnitA,而您的实现部分使用UnitB,那么如果单元B需要重新编译,那么您的单元就不需要重新编译,但是如果unitA更改了,那么您的单元就需要重新编译。
这是德尔菲超高速建造速度的秘密之一。
至于您已完成的可执行文件,我希望无论您将声明放在何处(链接器很聪明,只有应用程序实际使用的方法等中的链接),它的大小都是相同的,但是如果更改单元声明的顺序,那么各种源的实际位置几乎肯定会发生变化。
https://stackoverflow.com/questions/528472
复制相似问题