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では '{$ IF RTLVersion <19.0}'テストは '' contains''の後に**使用されていれば動作します。 –

+0

@Ulrich Gerhardt、非常に興味深い観測、ありがとう! (XEで確認済み) – OnTheFly

答えて

12

私も回避策として、デルファイ、2007年に過去に同じ問題を発見し、私は条件付きの定義とINCファイルを使用して、そう

{$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

どのような '' define.inc'を再利用することをお勧めしますか? – OnTheFly

+6

jediプロジェクトに含まれているincファイル(jclまたはjvcl) – RRUZ

2

よう{$IF}

何かの代わりに{$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} 

、コンパイラが正しく動作するもののように見えるが、問題のシンボルは、実際宣言されていないありながら、シンボルは定数式でないことに関する、むしろ(誤っていない場合は)誤解を招くメッセージを発行します!

8

packageモジュールは、programモジュールとlibraryモジュールとは異なります。実行可能コードは含まれておらず、use単位にすることはできません。したがって、RTLVersionのようなシンボルは、単にパッケージファイルからは見えません。あなたの唯一の選択肢は$IFDEFです。

+0

を使用してみてください。正確には正しくありません.Ulrich GerhardtのOPへのコメントを参照してください。 – OnTheFly

+0

まあ、私はそれを知らなかったが、 'contains 'の後に来る唯一のものは'終わり'なので悲しいことに、それはかなり役に立たない。 @David、同意した。 –

+0

:-) –

関連する問題