简单来说,初始化部分按照在任何单元中引入单元的顺序执行。uses
条款。但它比这要复杂一点,因为仅执行单元的初始化在该单元本身引用的任何单元初始化之后(它们尚未初始化)。
即给定:
program Foo;
uses
Unit1,
Unit2,
Unit3;
unit Unit1;
interface
uses
Unit3;
那么单元初始化顺序将是:
Unit3
Unit1
Unit2
这是因为Unit1
介绍Unit3
,所以即使Unit1
被列在第一个dpr uses, Unit3
实际上是首先初始化,然后是初始化Unit1
.
如果您还记得initialization
部分发生after any uses
单元中的子句,确实有意义。
因此,唯一能够绝对确定任何一个单元之前已初始化的方法any另一种是将其首先列出DPR uses
子句,并且该单元不依赖于任何其他单元(除非这些单元不依赖于或以其他方式干扰正在执行的初始化)。
它不一定是strictly当然是首先。例如如果您正在使用替换内存管理器(例如 FastMM),那么这绝对需要成为您的文件中列出的第一个单元dpr uses
条款。您只需要确保您需要在任何其他(您的单元)之前初始化的单元然后在可能将您的其他单元引入的任何其他单元之前列出:
program Foo;
uses
FastMM, // MUST be first but won't bring any of 'my' units in, so this is OK
SysUtils, // These too are fine coming next because again they don't
Forms, // reference 'my' units
MyInitUnit, // <- This is where it is important to list 'my' guaranteed first/earliest
// initialisated unit of all 'my' units
MyFirstAppUnit, // And now the rest ...
etc;
当然,如果您要先初始化的单元does之前需要初始化any其他,包括 RTL 单元(与 FastMM 等需要的方式相同),那么您需要在dpr uses
更早地声明您的单位来列出。