我在哪里定义用{$ IFDEF}测试的符号?

时间:2010-12-25 12:50:54

标签: delphi delphi-2009 compiler-directives

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

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

我在哪里为项目分配“某事”这个词?我在一些地方试过项目选项,但它没有用。猜猜我没找到正确的那个。

5 个答案:

答案 0 :(得分:16)

它位于Project |下的条件定义插槽中选项,在D2010上看起来像这样:

Delphi Project Options dialog

答案 1 :(得分:13)

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

然而,没有人提到的是,如果你更改了DEFINE符号,你必须对项目进行全面构建,以便它们对你的代码产生任何影响。

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

要强制要在所有单位中应用的DEFINE符号中的更改,必须“构建”,而不是编译。

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

答案 2 :(得分:12)

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

答案 3 :(得分:9)

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

  1. 在项目选项中(正如David Heffernan所说)
  2. 所有这些单位
  3. 中包含的包含文件中

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

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

答案 4 :(得分: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}