Directive IF (Object Pascal)

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Liste des directives de compilation Object Pascal - Index

Type

Compilation conditionnelle

Syntaxe

{$IF expression}

Remarques

Compile le code source Object Pascal qui la suit si l'expression est évaluée à true. L'expression doit respecter la syntaxe Object Pascal et renvoyer une valeur booléenne ; elle peut contenir des constantes déclarées, des expressions constantes et les fonctions Defined et Declared.

Par exemple,

 
...
{$DEFINE MY_DEFINE}

const LibVersion = 2.1;
...
begin
  ...
  {$IF Defined(MY_DEFINE) and (LibVersion > 2.0) }
    Writeln(1);
  {$ELSE}
    Writeln(2);  // this code does not execute
  {$IFEND}
  {$IF Defined(MY_DEFINE) }
    Writeln(3);  // this code executes
  {$ELSEIF LibVersion > 2.0}
    Writeln(4);  // this code does not execute
  {$ELSEIF LibVersion = 2.0}
    Writeln(5);  // this code does not execute
  {$ELSE}
    Writeln;  // this code does not execute
  {$IFEND}
  {$IF Declared(Test)}
    Writeln('Success'); // successful
  {$IFEND}
...
end.

Les fonctions spéciales Defined et Declared sont disponibles seulement au sein des blocs $IF et $ELSEIF. Defined renvoie True si l'argument qui lui est transmis est un symbole conditionnel défini. Declared renvoie True si l'argument qui lui est transmis est un identificateur Object Pascal déclaré valide et visible dans la portée en cours.

Si les identificateurs référencés dans l'expression conditionnelle n'existent pas, l'expression conditionnelle sera évaluée à False :

  {$IF NoSuchVariable > 5}
    Writeln('This line doesn''t compile');
  {$IFEND}

Vous pouvez utiliser la constante FireMonkeyVersion (définie dans FMX.Types.pas et égale à 16.1 avec la release XE2 Mise à jour 2) dans une directive IF. Pour identifier et séparer le code FireMonkey correspondant à toute version supérieure à 16.0, entourez le code avec la directive conditionnelle suivante :

  {$IF Declared(FireMonkeyVersion) and (FireMonkeyVersion > 16.0)}
    ...
  {$IFEND}

Les directives $IF et $ELSEIF sont terminées par $IFEND, au contraire des autres directives conditionnelles qui utilisent le terminateur $ENDIF. Cela vous permet de masquer les blocs $IF issus des versions antérieures du compilateur (qui ne supportent pas $IF ni $ELSEIF) en les imbriquant dans des blocs $IFDEF de style ancien. Par exemple, la construction suivante ne provoquera pas d'erreur de compilation :

  {$UNDEF NewEdition}
  {$IFDEF NewEdition}
    {$IF LibVersion > 2.0}
      ...
    {$IFEND}
  {$ENDIF}

$IF supporte l'évaluation de constantes typées, mais le compilateur n'autorise pas les constantes typées dans les expressions constantes. Ainsi,

  const Test: Integer = 5;
  {$IF SizeOf(Test) > 2}
    ...

est valide, tandis que

  const Test: Integer = 5;
  {$IF Test > 2 }         // error
    ...

génère une erreur de compilation.

Si votre code doit être portable entre diverses versions de Object Pascal, ou de plates-formes (comme .NET), vous devrez tester si cette directive est supportée par le compilateur. Vous pouvez entourer votre code avec les directives suivantes :

  {$IFDEF conditionalexpressions}
    .          // code including IF directive
    .          // only executes if supported
  {$ENDIF}

Voir aussi