7

Si consideri il seguente frammento di codice:Le espressioni condizionali sono suddivise in pacchetti?

requires 
    designide, 
    rtl, 
    vcl, 
    {$IF RTLVersion < 19.0}   // E2026 Constant expression expected 
    //{$IF CompilerVersion = 22.0}  // same as above 
    vcljpg; 
    {$ELSE} 
    vclimg; 
    {$IFEND} 

Sembra essere assolutamente sintatticamente corretto. Tuttavia, il compilatore soffoca su di esso e riporta Constant expression expected. Cosa succede veramente qui?

Tecnico: attualmente testato solo su XE (15.0.3953.35171).

Naturalmente, anche i suggerimenti di soluzione sono ben accetti.

+1

FWIW: in D2007 il test '{$ IF RTLVersion <19.0}' funziona se usato ** dopo ** il 'contains'clause. –

+0

@Ulrich Gerhardt, osservazione abbastanza interessante, grazie! (confermato con XE) – OnTheFly

risposta

12

ho trovato lo stesso problema in passato, anche con Delphi 2007. Come soluzione alternativa, io uso un file inc con le definisce condizionali e quindi utilizzare {$IFDEF} invece di {$IF}

qualcosa di simile in modo

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

Quale 'define.inc' si consiglia di riutilizzare (tra manutenzioni e senza licenza virale)? – OnTheFly

+6

Prova a usare i file inc inclusi nel progetto jedi (jcl o jvcl) – RRUZ

2

Sono convinto di cosa ho appena scoperto la causa. Si consideri il seguente:

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

Così, sembra essere quello che il compilatore si comporta correttamente, ma emette una piuttosto fuorviante (se non errata) messaggio sul simbolo non essere un'espressione costante, mentre simbolo in questione in realtà è non dichiarato !

8

package I moduli sono diversi dai moduli program e library. Non contengono codice eseguibile e non è possibile utilizzare le unità use. Pertanto, simboli come RTLVersion semplicemente non sono visibili da un file di pacchetto. L'unica opzione è usare $IFDEF.

+0

E non è esattamente corretto, vedi il commento di Ulrich Gerhardt a OP. – OnTheFly

+0

Beh, non lo sapevo, ma purtroppo è inutilmente triste poiché l'unica cosa che viene dopo 'contains' è' end'. –

+0

@David, d'accordo. :-) –