根据具体项目,通用单元中的条件编译?

时间:2014-06-09 19:27:09

标签: delphi delphi-xe2 conditional-compilation

在Delphi XE2中,我有一个 MyUnit.pas 单元,由两个不同的项目 ProjectA ProjectB 使用。
MyUnit 包含声明DoSomething;(这是在其他单位 OtherUnit.pas 中实施的程序。)
现在,我想使用条件编译仅在 ProjectA 编译中包含DoSomething,在 ProjectB 中包含而不是编译,以避免 ProjectB 间接包含/编译 OtherUnit.pas
这必须是条件编译,因为简单的if/else语句显然不适用于此目的。
如何实现这一目标?

2 个答案:

答案 0 :(得分:4)

您需要在一个项目中定义条件,而不是在另一个项目中定义条件。例如,您可以在项目A的项目选项中定义CanUseOtherUnit,但不能在项目B中定义。{/ p>

然后您需要对MyUnit.pas进行以下更改。

将引用uses的{​​{1}}子句放在OtherUnit中:

$IFDEF

然后在你调用该函数时,再次将调用包装在uses ... {$IFDEF CanUseOtherUnit}, OtherUnit{$ENDIF}; 内:

$IFDEF

由于条件没有在项目B中定义,编译器会忽略{$IFDEF CanUseOtherUnit} DoSomething; {$ENDIF} 指令中的代码。


当您主动要求不使用某个单元时,搜索路径的便利性就会变弱。在没有意识到的情况下,您可以轻松地将单元添加到程序中。当您不使用搜索路径,并被迫将源文件添加到项目(.dpr文件)时,您不会意外地获取新的依赖项。

答案 1 :(得分:2)

我确信这是一个重复的东西,但我找不到一个明显的解释基本概念。这在文档(http://docwiki.embarcadero.com/RADStudio/XE6/en/Conditional_compilation_%28Delphi%29)中进行了解释。

您可以使用{$ IFDEF}。你用以下方法检查:

{$IFDEF MyValue}
{$ELSE}
{$ENDIF}

或未定义:

{$IFNDEF MyValue}
{$ELSE}
{$ENDIF}

然后您需要定义值。您可以在包含以下内容的源文件中执行此操作:

{$DEFINE MyValue}

或在您的项目选项中(项目>选项> Delphi编译器)。