【问题标题】:Can I define conditionals in a unit and use them in other units?我可以在一个单元中定义条件并在其他单元中使用它们吗?
【发布时间】:2013-03-04 18:11:34
【问题描述】:

我正在研究一个大型单元,该单元太大了,我决定将它分成 3 个单元。假设这些单元名称是MainCommonObjectsMain 单元同时使用其他两个单元,Objects 单元也使用Common 单元。三个单元都有代码需要引用这些条件。

问题是,无论我在 3 个单位中的哪一个中定义这些条件,其他 2 个单位都看不到它们。我当然不想在所有 3 个单元中复制它们。我也不想在项目中定义它们,因为这些单元将被多个项目使用,在这种情况下,所有使用它的项目都不应该关心条件。

我能否以一种所有 3 个单元都能看到的方式定义这些条件,而不在项目中定义它们?

【问题讨论】:

  • 您可以使用包含文件。
  • +1。不过,我不明白反对将它们放入项目文件中。如果它在那里,它不会影响使用单位的任何其他项目(只要他们使用单位而不是编译的 .dcu 文件),因为项目文件中的定义仅适用于项目所在的项目应用定义。使用这些单元的其他项目对定义一无所知,并且会在不影响任何内容的情况下编译这些单元。但是,除非其他项目知道在编译之前适当地更改包含文件,否则将它们放在包含文件中。
  • @Ken 因为无论哪个项目使用这些单元,所有项目都应该假设相同的条件,而不必担心它们。例如,10 个不同的项目可能需要完全相同的条件。另外,我需要定义 12 个条件,我不希望最终开发人员在项目中定义所有这 12 个条件,因为他们甚至没有理由知道这些条件存在。
  • 这是有道理的。谢谢。 :-) 我的理解不同。
  • @KenWhite:另一个原因是项目文件一直被 Delphi 修改,并且经常被签入而不仅仅是预期的更改。为了拥有可重现的构建(调试和发布),我们一直在积极减少对 dproj 文件的依赖。我们甚至以不同的方式为每个项目注册我们依赖的库,并在我们更改库或版本时将所有项目的搜索路径重建到它们的 dproj 中。这也恰好添加了记录为项目注册了哪些库版本以及实际使用了哪些库版本的功能。

标签: delphi delphi-xe2 conditional-compilation delphi-units


【解决方案1】:

对于条件定义,您唯一的选择是将它们放在一个 .inc 文件中,然后将其包含在所有三个单元中。

但是,条件定义和$IFDEF并不是实现条件编译的唯一方法。您可能会考虑使用布尔常量而不是条件。只要它在所有三个单元中都可见,就可以使用$IF 而不是$IFDEF

{$IF MyConstant}
  ....
{$IFEND}

或者,从 XE3 开始,您可以使用 {$ENDIF} 终止 {$IF}

在尝试有条件地编译并且不希望条件具有全局范围时,我个人倾向于使用后一种方法。

【讨论】:

  • 我喜欢{$IF MyConstant} 方法。 MyConstant 你倾向于使用什么?顺便说一句,您为什么不希望您的条件具有全球范围?换句话说:只是对您使用条件编译的目的感兴趣。我目前在所有路径上都“无条件”,除了可能确保编译器版本与我们软件的旧版本兼容。
  • @MarjanVenema 通常用于诊断/调试代码,由于性能问题,我们无法编译成标准版本。如您所知,最好不要干预项目文件,并且源代码的本地更改不那么不透明。
  • 您的其他选择是在项目中输入它们(条件定义)或在编译器命令行中传递它们:-)
  • @Marco 这些选项被问题明确拒绝
  • 教我深夜不回答:-)
猜你喜欢
  • 2017-08-23
  • 2011-07-22
  • 2014-09-30
  • 2010-10-25
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多