gpt4 book ai didi

delphi - 将单元添加到项目正在从项目源中删除编译器指令

转载 作者:行者123 更新时间:2023-12-03 15:00:31 25 4
gpt4 key购买 nike

应该这样工作还是我做错了什么?

我的项目源代码中有此代码:

  {$IFDEF DEBUG}
ADebugUnit,
{$ELSE}
ARelaseUnit,
{$ENDIF}

我希望在 Debug模式下使用 ADebugUnit,但在 Release模式下编译时使用 AReleaseUnit。这非常有效,除非我选择向项目添加新单元。当我这样做时,它基本上会处理代码,并且只保留与项目当前设置的配置相关的单元。

例如,如果配置设置为“调试”,则在向我的项目添加新单元后,上述代码将更改为:

ADebugUnit,

或者,如果我的配置设置为“发布”,添加新单元后它将更改为以下内容:

ARelaseUnit,

添加新单元后,我必须始终将其恢复到条件语句。有没有办法在不添加新单位干扰的情况下完成此任务?

最佳答案

问题是 DPR 不会尊重使用列表中的任何 $ifdef,并且实际上会在重写响应列表时删除它们(正如您所发现的)某些 IDE 操作。

一种选择是永远不要使用这些 IDE 操作,例如“添加/删除单元”等,并且仅手动管理 DPR 使用列表。

或者,只要稍微小心一点,您就可以使用单元别名来实现您想要的目的。

考虑两个单元,您希望根据构建配置(调试或发布)使用其中一个或另一个:

  • 调试单元.pas
  • ReleaseUnit.pas

在您的项目选项中添加一个单元别名:

调试配置:

  UnitToUse=DebugUnit

发布配置:

  UnitToUse=ReleaseUnit

在您的 DPR 中添加一个条目到使用列表中:

  uses
UnitToUse,

DPR 中的此条目无法使用“in '”语法识别文件名,而必须依赖项目搜索路径上所需的实际单位。

任何通常使用 DebugUnitReleaseUnit 的地方,请参阅 UnitToUse。显然,别名的名称完全取决于您。

如果两个单元具有相同的接口(interface)“契约(Contract)”,那么您的构建只需更改目标配置即可在这两个单元之间切换。

如果它们具有不同接口(interface)协定,那么您仍然可以在应用程序代码中使用$ifdef指令来处理任何单元UnitToUse的内容> 酌情指的是,例如

uses
UnitToUse;


procedure DoSomethingInvolvingAliasedUnit;
begin
{$ifdef DEBUG}
// code which relies on the debug unit
{$else}
// code which relies on the release unit
{$endif}
end;

关于delphi - 将单元添加到项目正在从项目源中删除编译器指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19411055/

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