我在哪里定义用{$ ifdef}测试的符号?
-
13-10-2019 - |
题
当我在代码中使用Delphi指令时,例如:
{$IFDEF something}
.
.
.
{$ENDIF}
我在哪里分配项目中的“某物”一词?我在项目选项的某些地方尝试过,但它不起作用。猜猜我没有找到正确的一个。
解决方案
在 有条件定义 项目下的插槽|选项,在D2010上看起来像这样:
其他提示
其他答案将您指向定义符号和不同方法的范围含义的地方。
但是,尚未有人提到的是,如果您更改定义符号,则必须对项目进行完整构建,才能对您的代码产生任何影响。
当您“编译”时,Delphi编译器将仅编译自上次编译以来自身更改的单元。如果更改定义符号,则不会更改任何项目单元,因此,如果未重新编译单元,则定义符号的更改将不会在这些单元中产生任何效果。
要强制定义要应用于所有单位的符号的变化,您必须“构建”,而不是编译。
这可能解释了为什么您试图定义的尝试以前似乎不起作用
您也可以在{$定义中定义它们u003Csymbol>}指令。什么是范围。定义一个u003Csymbol>在项目选项中定义的条件下,范围是整个项目的全局。 $定义指令仅是从声明到当前模块末尾的点,或直到使用相同的$ UNDEF指令的指令有效u003Csymbol>遇到。使用什么取决于您的需求以及IFDEF的作用。
在两个地方,您可以将有条件定义用于项目的所有单位:
- 在项目选项中(正如大卫·赫弗南(David Heffernan)所说的那样)
- 在包含的文件中包含在 全部 这些单位
我为什么要提到第二个选项?因为它允许基于Verxxx条件定义的专门处理,并在1中给出其他条件定义。
另外,正如Deltics所说:当它确定要重新编译的单元时,编译器仅检查单元本身是否已更改,而不是条件定义或任何包含文件已更改。因此,如果您更改有条件的定义,则必须进行重建,而不仅仅是重新编译。由于Delphi编译器非常快,因此幸运的是,在编译时没有太大的不同。
您可以使用.inc扩展名中的外部文件中定义全局符号。创建一个新的文本文件,放入所有定义的内容,然后将其保存为例如Predefines.inc:
---文件的内容predefines.inc-----
{$DEFINE Symbol}
{$IFDEF Symbol}
{$DEFINE AnotherSymbol}
{$ENDIF}
在您需要检查的Delphi模块中定义了符号,将此代码放入接口部分:
interface
{$I Predefines.inc}
uses ...
// Check you defines
{$IFDEF Symbol}
...
{$ENDIF}