7

Considere el siguiente fragmento:¿Se rompen las expresiones condicionales dentro de los paquetes?

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

Parece ser absolutamente sintácticamente correcta. Sin embargo, el compilador se ahoga e informa Constant expression expected. ¿Qué pasa realmente aquí?

Técnico: actualmente probado solo en XE (15.0.3953.35171).

Por supuesto, las sugerencias de soluciones también son bienvenidas.

+1

FWIW: En D2007 la prueba '{$ IF RTLVersion <19.0}' funciona si se usa ** después de ** la cláusula 'contains'. –

+0

@Ulrich Gerhardt, observación bastante interesante, ¡gracias! (confirmado con XE) – OnTheFly

Respuesta

12

me encontré con el mismo problema en el pasado, incluso con Delphi 2007. Como solución alternativa, utilizo un archivo inc con los define condicionales y luego usar {$IFDEF} en lugar de {$IF}

algo así como lo que

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

¿Qué 'defines.inc' recomendarías reutilizar (entre licencia viral mantenida y sin licencia viral)? – OnTheFly

+6

Intente utilizar los archivos inc incluidos en el proyecto jedi (jcl o jvcl) – RRUZ

2

Estoy convencido de lo que acabo de encontrar la causa. Considere lo siguiente:

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

Por lo tanto, parece ser lo que el compilador se comporta correctamente, pero emite un mensaje bastante engañosa (si no errónea) sobre el símbolo no ser una expresión constante, mientras que el símbolo en cuestión en realidad es no declarada !

8

package módulos son diferentes de los módulos program y library. No contienen código ejecutable y no puedes use unidades. Por lo tanto, los símbolos como RTLVersion simplemente no son visibles desde un archivo de paquete. Su única opción es usar $IFDEF.

+0

Y no es exactamente correcto, consulte el comentario de Ulrich Gerhardt a OP. – OnTheFly

+0

Bueno, yo no sabía eso, pero es bastante inútil, lamentablemente, ya que lo único que viene después de 'contiene' es' fin'. –

+0

@David, de acuerdo. :-) –

Cuestiones relacionadas