15

当我在代码中使用 Delphi 指令时,例如:

{$IFDEF something}
.
.
.
{$ENDIF}

我在项目中在哪里分配“某事”这个词?我在项目选项的某些地方尝试过,但没有奏效。估计我没找到对的。

4

5 回答 5

19

它位于Project | 下的Conditional Defines槽中。选项,在 D2010 上如下所示:

Delphi 项目选项对话框

于 2010-12-25T12:57:36.550 回答
14

其他答案为您指出了定义符号的位置以及不同方法的范围含义。

但是,尚未有人提到的是,如果您更改 DEFINE 符号,您必须对您的项目进行 FULL BUILD,以便它们对您的代码产生任何影响。

当您“编译”时,Delphi 编译器将只编译自上次编译后自身发生变化的单元。如果您更改 DEFINE 符号,这不会更改任何项目单位,因此如果未重新编译这些单位,则 DEFINE 符号的更改将不会对这些单位产生任何影响。

要强制更改 DEFINE 符号以应用于所有单元,您必须“构建”,而不是编译。

这可以解释为什么您尝试设置定义以前似乎不起作用

于 2010-12-26T03:17:10.310 回答
12

您还可以在 {$DEFINE <symbol>} 指令中定义它们。变化的是范围。当您在项目选项中的条件定义下定义 <symbol> 时,范围对整个项目都是全局的。$DEFINE 指令仅在它们被声明到当前模块的末尾时有效,或者直到遇到使用相同 <symbol> 的 $UNDEF 指令。使用什么取决于您的需求以及 IFDEF 的功能。

于 2010-12-25T19:54:12.890 回答
9

有两个地方可以放置在项目的所有单元中使用的条件定义:

  1. 在项目选项中(正如大卫赫弗南已经说过的)
  2. 在包含在所有这些单元中的包含文件中

为什么我提到第二个选项?因为它允许基于 VERxxx 条件定义和 1 中给出的其他条件定义进行专门处理。有关示例,请参见 jedi.inc(来自 Jedi JCL)。

此外,正如 Deltics 所说:当它确定要重新编译哪些单元时,编译器只检查单元本身是否已更改,而不是条件定义或任何包含文件是否已更改。因此,如果您更改条件定义,您必须进行重建,而不仅仅是重新编译。由于 Delphi 编译器非常快,幸运的是这对编译时间没有太大影响。

于 2010-12-26T11:56:28.947 回答
6

您可以在扩展名为 .inc 的外部文件中定义全局符号。创建一个新的文本文件,将您定义的所有内容放入其中并将其保存为例如 Predefines.inc:

--- Predefines.inc 文件的内容 ---

{$DEFINE Symbol}
{$IFDEF Symbol}
  {$DEFINE AnotherSymbol}
{$ENDIF}

在您需要检查是否已定义符号的 Delphi 模块中,将此代码放在接口部分:

interface

{$I Predefines.inc}

uses ...

// Check you defines

{$IFDEF Symbol}
...
{$ENDIF}
于 2014-04-16T07:43:45.857 回答