请考虑以下代码段:
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)上进行测试。
当然,也欢迎变通方法建议。
答案 0 :(得分:12)
我在过去发现同样的问题,即使使用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}
答案 1 :(得分:8)
package
个模块与program
和library
个模块不同。它们不包含可执行代码,您不能use
个单位。因此,从包文件中看不到像RTLVersion
这样的符号。您唯一的选择是使用$IFDEF
。
答案 2 :(得分:2)
我确信我刚刚找到了原因。请考虑以下事项:
{$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}
所以,它似乎是编译器的行为正确,但发出了一个相当误导(如果不是错误的)有关符号不是常量表达式的消息,而有问题的符号实际上是未声明的!