gpt4 book ai didi

delphi - 单元初始化顺序与源代码中所示不符

转载 作者:行者123 更新时间:2023-12-03 18:22:05 26 4
gpt4 key购买 nike

我有一个项目,其中多个单元都有初始化部分。我想控制这些 block 的执行顺序。

根据以下question ,这基于单元的编译顺序,因此最终顺序应基于源 DPR 的 use 子句中单元的排列。

以下是我的项目的DPR源码:

program X;

uses
Vcl.Forms,
uMain in 'uMain.pas' {MainForm},
uFooA in 'uFooA.pas',
uFooB in 'uFooB.pas';

{$R *.res}

begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
Application.Run;

end.

我的问题是,这根本不是初始化 block 的执行顺序。

How it should be |  How it actually is
|
1. uMain | 1.uFooA
2. uFooA | 2.uFooB
3. uFooB | 3.uMain

我很乐意提供 SSCCE,但我根本无法在新项目上重现此问题。

我尝试重新构建该项目,但没有成功。

我错过了什么?

最佳答案

尽管编译器有一种严格的方式来确定初始化,但当存在许多具有许多依赖性的单元时,人类很难准确地弄清楚和控制。

例如您的 DPR 可以使用 UnitA、UnitB、UnitC;,但如果 UnitA 依赖于 UnitB,则必须首先初始化 UnitB。

诚然,具有初始化最终化部分的单元功能可以使添加功能像“添加单元”一样简单。尽管这看起来很棒,但实际上,在大型项目中它往往会造成阻碍。我个人认为这个“功能”非常糟糕。

控制单元初始化顺序的最佳且最可靠的方法是明确地执行此操作。例如

program X;

uses
Vcl.Forms,
uMain in 'uMain.pas' {MainForm},
uFooA in 'uFooA.pas',
uFooB in 'uFooB.pas';

{$R *.res}

begin
Init_uMain;
Init_uFooA;
Init_uFooB;

Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
Application.Run;

Finalise_uFooB;
Finalise_uFooA;
Finalise_uMain;
end.

显然上面的代码缺乏适当的 try..finallys 并且会因为许多需要初始化的单元而变得困惑。但是,还可以应用其他技术来使事情变得易于管理。

关于delphi - 单元初始化顺序与源代码中所示不符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21184905/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com