7

考虑下面的代码片段:包内是否有条件表达式被破坏?

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)上进行测试。

当然,解决方法建议也是受欢迎的。

+1

FWIW:在D2007中,如果在** contains之后使用**,{{IF IF RTLVersion <19.0}'测试工作。 –

+0

@Ulrich Gerhardt,相当有趣的观察,谢谢! (由XE确认) – OnTheFly

回答

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} 
+0

您建议重新使用哪一个'defines.inc'(在维护和无病毒许可证中)? – OnTheFly

+6

尝试使用jedi项目中包含的inc文件(jcl或jvcl) – RRUZ

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} 

所以,这似乎是什么编译器能正常运行,但会发出约不是一个常量表达式符号而误导(如果没有错误)消息,而在问题符号实际上是未申报

8

package模块不同于programlibrary模块。它们不包含可执行代码,并且不能包含use单位。因此,诸如RTLVersion之类的符号在包文件中根本不可见。您唯一的选择是使用$IFDEF

+0

这并不完全正确,请参阅Ulrich Gerhardt对OP的评论。 – OnTheFly

+0

嗯,我不知道,但它是相当无用的,因为'contains'后面的唯一东西是'end.'。 –

+0

@David,同意。 :-) –