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,同意。 :-) –