5

Delphi 中的条件定义限制为 255 个字符。这意味着如果您有超过 255 个字符的定义,它们将被忽略。例如

在此处输入图像描述

所以这组条件定义:

Win32API;AlarmServerEngineVersion27;ImNotUsingOlderSimpleThread;EnableJclExceptionTracking;SaveExceptionsToDatabase;ShowExceptionForm;SNAPIN_NEEDS_NODE_DESCRIPTOR;VIRTUAL_TREES_MOUSE_DOWN_FOCUS_LAST;UseSQLServerLocking;SnapInFactoryFormClassIsOptional;Strict;SIFFCIO;Sqm

最后 3 个定义被忽略。

我需要的是一种在项目中定义条件定义的方法,而不限于 255 个字符。

我想也许将条件定义移动到项目源文件中,可能包含在包含文件中:

program ConsotoManager;

{$R *.RES}
{$R '..\Resource\Wumpa.res' '..\Resource\Wumpa.rc'}
{$DEFINE Win32API}
...
{$DEFINE Sqm}
{$DEFINE Strict}

uses
  FastMM4,
  Windows,
  SysUtils,

不幸的是,它不起作用。它不起作用的原因是您不能用定义代替条件定义;仅定义持续到文件末尾。

那么,如何克服Delphi中条件定义的 255 个字符限制?


当然,问题是如何定义项目级别,同时共享源代码文件(共享文件位于项目文件夹之外的自己的目录中)。

4

2 回答 2

9

项目文件中的定义几乎已经完成,但请记住,Delphi 不是 C — 编译器不会在每次编译任何内容时按顺序读取每个提到的单元,就好像所有文件都以文本形式粘贴在一起一样,所以项目文件中定义的内容在该文件之外不可见。

然而,Delphi就像C 一样,它支持一个名为的指令include,该指令确实会导致它在每次编译时重新读取提到的文件。让我们使用它。

首先,将所有定义放入单独的文本文件中。我们称之为Defines.inc

{$DEFINE Win32API}
...
{$DEFINE Sqm}
{$DEFINE Strict}

然后将该文件包含到需要任何这些定义的所有源文件中。

program ConsotoManager;

{$R *.RES}
{$R '..\Resource\Wumpa.res' '..\Resource\Wumpa.rc'}
{$INCLUDE Defines.inc}

uses
  FastMM4,
  Windows,

现在您可以清除项目选项中的列表,而是将所需的任何定义添加到该文件中。当您更改该文件时,您可能需要进行完整构建(而不是简单编译)才能使更改生效。

另外,考虑一下你是否真的需要这么多编译变量。也许其中一些总是被定义的,所以在编译时检查它们是没有意义的。也许其中一些是多余的。

于 2013-07-15T18:11:02.953 回答
0

我的 Delphi 有点生疏,但我相信您可以创建一个定义来代表所有其他已定义的定义,因此您只需检查一个条件。

{$IF    Defined(Win32API)
    AND Defined(AlarmServerEngineVersion27)
    AND Defined(ImNotUsingOlderSimpleThread)
    AND Defined(EnableJclExceptionTracking)
    AND Defined(SaveExceptionsToDatabase)
    AND Defined(ShowExceptionForm)
    AND Defined(SNAPIN_NEEDS_NODE_DESCRIPTOR)
    AND Defined(VIRTUAL_TREES_MOUSE_DOWN_FOCUS_LAST)
    AND Defined(UseSQLServerLocking)
    AND Defined(SnapInFactoryFormClassIsOptional)
    AND Defined(Strict)
    AND Defined(SIFFCIO)
    AND Defined(Sqm)
}
{$DEFINE I_AM_TOTALLY_READY}
{$IFEND}
于 2013-07-15T17:48:36.960 回答