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