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

15

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

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

我应该在项目中的哪里分配词汇 "something"?我尝试过在一些项目选项中,但没有起作用。我猜我没有找到正确的位置。


模块处理结束时忘记了条件符号,请阅读文档。 - Free Consulting
5个回答

20

在 D2010 中,这在项目 | 选项下的 条件定义 插槽中,看起来像这样:

Delphi 项目选项对话框


5
我猜测原帖作者之前尝试过标记为“目录和条件”的树形视图中的设置,但并没有意识到这些设置仅适用于资源编译器... DELPHI编译器本身并没有如此明显突出的设置。当这个“大有改善”的项目选项对话框首次出现时,我指出了这个小错误。自从伽利略以来,这个对话框仍然是IDE在可用性方面迈出的最大倒退之一。 - Deltics
上面的截图和评论对我帮助很大 - 我在资源编译器部分摆弄了一段时间,而我应该看看 Delphi 编译器。唉! - Duncan
请确保没有人在代码中放置了{$UNDEF something},以覆盖项目 | 选项 | Delphi编译器 | 条件定义。 - undefined

14

其他答案已经指出了定义符号的位置以及不同方法的作用域影响。

但是,还没有人提到,如果您更改DEFINE符号,则必须对项目进行完整构建,才能使它们对您的代码产生任何影响。

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

为了强制应用DEFINE符号的更改到所有单元中,您必须进行“构建”,而不是“编译”。

这可能解释了为什么您之前尝试设置定义符号似乎没有起作用。


12
您也可以在{$DEFINE

9
有两个地方可以放置条件定义,这些条件定义在项目的所有单元中都会使用:
1. 项目选项中(如David Heffernan所说) 2. 包含在所有这些单元中的包含文件中
为什么要提到第二个选项?因为它允许基于VERxxx条件定义和其他条件定义进行专门处理。请参见Jedi JCL中的jedi.inc示例。
此外,正如Deltics所说:当确定要重新编译哪些单元时,编译器仅检查单元本身是否已更改,而不是条件定义或任何包含文件是否已更改。因此,如果您更改了条件定义,则必须执行重建操作,而不仅仅是重新编译。由于Delphi编译器非常快,因此对于编译时间来说,这并没有太大的影响。

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}

将条件定义放置在纯文本的.inc文件中对程序员来说更加明显,也更容易管理。 - Edwin Yip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接