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

所以条件定义的集合:
Win32API;AlarmServerEngineVersion27;ImNotUsingOlderSimpleThread;EnableJclExceptionTracking;SaveExceptionsToDatabase;ShowExceptionForm;SNAPIN_NEEDS_NODE_DESCRIPTOR;VIRTUAL_TREES_MOUSE_DOWN_FOCUS_LAST;UseSQLServerLocking;SnapInFactoryFormClassIsOptional;Strict;SIFFCIO;Sqm
Run Code Online (Sandbox Code Playgroud)
最后3个定义被忽略.
我需要的是一种在项目中定义条件定义的方法,而不限于255个字符.
我想可能将条件定义移动到项目源文件,可能包含在include文件中:
program ConsotoManager;
{$R *.RES}
{$R '..\Resource\Wumpa.res' '..\Resource\Wumpa.rc'}
{$DEFINE Win32API}
...
{$DEFINE Sqm}
{$DEFINE Strict}
uses
FastMM4,
Windows,
SysUtils,
Run Code Online (Sandbox Code Playgroud)
不幸的是它不起作用.它不起作用的原因是你不能用条件定义替换定义; 仅定义直到文件结尾的最后一个.
那么,我如何克服Delphi中条件定义的255个字符限制?
当然,问题是如何拥有项目级别定义,同时拥有共享源代码文件(共享文件位于项目文件夹之外的自己的目录中).
你几乎在项目文件中有定义,但是请记住Delphi不是C - 编译器在每次编译任何内容时都不按顺序读取每个提到的单元,就好像所有文件都是文本粘贴在一起一样,所以在该文件外部将看不到项目文件中定义的内容.
然而,德尔福是像C,它支持一个名为指令include是不会导致它重新读取每个编译所提到的文件.让我们用它.
首先,将所有定义放入单独的文本文件中.我们称之为Defines.inc.
{$DEFINE Win32API}
...
{$DEFINE Sqm}
{$DEFINE Strict}
Run Code Online (Sandbox Code Playgroud)
然后将该文件包含在需要任何这些定义的所有源文件中.
program ConsotoManager;
{$R *.RES}
{$R '..\Resource\Wumpa.res' '..\Resource\Wumpa.rc'}
{$INCLUDE Defines.inc}
uses
FastMM4,
Windows,
Run Code Online (Sandbox Code Playgroud)
现在,您可以清除项目选项中的列表,而是将所需的任何定义添加到该文件中.更改该文件时,可能需要执行完整构建(而不是简单的编译)才能使更改生效.
另外,考虑一下你是否真的需要这么多的编译变量.也许其中一些总是被定义,所以在编译时检查它们是没有意义的.也许其中一些是多余的.
我的 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}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
314 次 |
| 最近记录: |