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

Delphi 如何克服条件定义的255个字符限制?,delphi,delphi-5,Delphi,Delphi 5,Delphi中的条件定义限制为255个字符。这意味着,如果定义的字符数超过255个,它们将被忽略。例如 因此,条件集定义: Win32API;AlarmServerEngineVersion27;ImNotUsingOlderSimpleThread;EnableJclExceptionTracking;SaveExceptionsToDatabase;ShowExceptionForm;SNAPIN_NEEDS_NODE_DESCRIPTOR;VIRTUAL_TREES_MOUSE_DOWN

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个字符

我想可能会将条件定义移动到项目源文件中,可能通过include文件包含:

program ConsotoManager;

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

uses
  FastMM4,
  Windows,
  SysUtils,
不幸的是,它不起作用。它不起作用的原因是您不能用defines替换conditional defines;仅定义文件结束前的最后一个

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



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

我的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}

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

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

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

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

program ConsotoManager;

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

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


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

问题在于共享文件。他们拥有15年的新特性和向后兼容性,每个项目都可以选择加入或退出。如果我将
{$INCLUDE Defines.inc}
添加到
VirtualTrees.pas
的顶部,它将无法工作,因为它无法找到
Defines.inc
(由于
Defines.inc
位于我的项目的源文件夹中。即使它确实有效,我也会对库进行突破性的更改,因为其他项目都没有此
Defines.inc
文件。我已经开始使define
Strict
启用其他定义。因此,您可以定义
Strict
,而h将自动启用一些其他定义。我还使define
inuost
启用define
ImNotUsingOlderSimpleThread
,作为保存珍贵字符的一种方式。我需要在项目中放置一个位置来放置“条件定义”它在所有编译的单元上运行;而不仅仅是在定义它们的单元的末尾。
program ConsotoManager;

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

uses
  FastMM4,
  Windows,