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

dzi*_*bul 12 delphi compiler-directives delphi-2009

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

{$IFDEF something}
.
.
.
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*nan 17

它位于Project |下的Conditional Defines插槽中 选项,在D2010上看起来像这样:

Delphi项目选项对话框

  • 我猜测OP之前曾尝试将树视图中标记为"目录和条件"的设置,并且没有意识到这些只适用于资源编译器...... DELPHI编译器本身没有明确突出显示的设置.我在第一次对我们施加的"大大改进的"项目选项对话框中指出了这个SNAFU.自Galileo以来,这个对话框仍然是IDE中可用性的最大步骤之一. (5认同)

Del*_*ics 13

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

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

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

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

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


小智 12

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


dum*_*uch 9

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

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

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

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


Iva*_*n Z 6

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

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

{$DEFINE Symbol}
{$IFDEF Symbol}
  {$DEFINE AnotherSymbol}
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)

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

interface

{$I Predefines.inc}

uses ...

// Check you defines

{$IFDEF Symbol}
...
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)