【问题标题】:How to overcome 255 character limit on conditional defines?如何克服条件定义的 255 个字符限制?
【发布时间】:2013-07-15 17:32:06
【问题描述】:

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 个字符限制?


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

【问题讨论】:

    标签: delphi delphi-5


    【解决方案1】:

    项目文件中的定义几乎已经完成,但请记住,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,
    

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

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

    【讨论】:

    • 问题是共享文件。他们有 15 年的新功能和向后兼容性,可以选择加入或退出每个项目。如果我将{$INCLUDE Defines.inc} 添加到VirtualTrees.pas 的顶部,它将无法工作,因为它无法找到Defines.inc(因为Defines.inc 位于我项目的源文件夹中。即使它确实有效,我将对库进行重大更改,因为其他项目都没有这个Defines.inc 文件。
    • 我已经开始使定义Strict 启用其他定义。所以你可以定义Strict,它会自动启用其他一些定义。我还让定义inuost 启用定义ImNotUsingOlderSimpleThread,作为保存珍贵字符的一种方式。我需要在项目中放置一个对所有编译单元进行操作的“条件定义”;不只是直到它们被定义的单元结束。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 2020-07-03
      • 2011-02-27
      相关资源
      最近更新 更多