考虑以下代码片段:
requires
designide,
rtl,
vcl,
{$IF RTLVersion < 19.0} // E2026 Constant expression expected
//{$IF CompilerVersion = 22.0} // same as above
vcljpg;
{$ELSE}
vclimg;
{$IFEND}
这在语法上似乎是绝对正确的。然而,编译器却卡住了并报告
Constant expression expected
。这里到底发生了什么?
技术:目前仅在 XE (15.0.3953.35171) 上进行测试。
当然,也欢迎提出解决方法建议。
即使在 delphi 2007 中我也发现了同样的问题。作为解决方法,我使用带有条件定义的 inc 文件,然后使用
{$IFDEF}
而不是 {$IF}
类似这样的事情
{$I MyDefines.INC}
requires
designide,
rtl,
vcl,
{$IFDEF DELPHI_XE_UP} //the DELPHI_XE_UP is defineed inside of MyDefines.INC
uNewlib;
{$ELSE}
uOldLib;
{$ENDIF}
package
模块与 program
和 library
模块不同。它们不包含可执行代码,您不能 use
单元。因此,像 RTLVersion
这样的符号在包文件中根本不可见。您唯一的选择是使用 $IFDEF
。
我确信我刚刚找到的原因。考虑以下几点:
{$IF not Declared(RTLVersion)}
{$MESSAGE WARN 'There is no RTL'}
{$IFEND}
{$IF not Declared(CompilerVersion)}
{$MESSAGE WARN 'nor are compiler intrinsics at all'}
{$IFEND}
{$IF not Declared(System)}
{$MESSAGE ERROR 'Because package not uses System implicitly'}
{$IFEND}
因此,编译器的行为似乎是正确的,但会发出一条相当误导性的(如果不是错误的)消息,表明符号不是常量表达式,而有问题的符号实际上是未声明!