Compilation conditionnelle (Object Pascal)

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Liste des directives de compilation Object Pascal - Index

La compilation conditionnelle est basée sur l'existence et l'évaluation de constantes, le statut des commutateurs du compilateur et la définition des symboles conditionnels.

Les symboles conditionnels fonctionnent comme des variables booléennes : ils sont soit définis (True) soit non définis (False). Tout symbole conditionnel valide est considéré comme false jusqu'à ce qu'il soit défini.

Vous pouvez définir une condition de plusieurs façons :

  • Utilisez la directive {$DEFINE} pour définir un symbole spécifié sur True, et la directive {$UNDEF} pour définir le symbole sur False.
  • Utilisez le commutateur -D avec le compilateur en ligne de commande (cette option est supportée par tous les compilateurs Object Pascal).
  • Ajoutez le symbole au champ Définitions conditionnelles sur la page Projet > Options > Compilateur Object Pascal.

Les directives conditionnelles {$IFDEF}, {$IFNDEF}, {$IF}, {$ELSEIF}, {$ELSE}, {$ENDIF} et {$IFEND} vous permettent de compiler ou de supprimer du code selon le statut d'un symbole conditionnel. {$IF} et {$ELSEIF} vous permettent de baser la compilation conditionnelle sur des identificateurs Object Pascal déclarés. {$IFOPT} compile ou supprime du code selon que le commutateur de compilation spécifié est activé ou non.

Par exemple, l'extrait de code Object Pascal suivant est traité différemment selon que la définition conditionnelle DEBUG est définie ou non ({$DEFINE DEBUG}) :

  {$DEFINE DEBUG}
 	{$IFDEF DEBUG}
 	Writeln('Debug is on.');  // This code executes.
 	{$ELSE}
 	Writeln('Debug is off.');  // This code does not execute.
 	{$ENDIF}
 	{$UNDEF DEBUG}
 	{$IFNDEF DEBUG}
 	Writeln('Debug is off.');  // This code executes.
 	{$ENDIF}

Remarque : Les symboles conditionnels ne sont pas des identificateurs Object Pascal et ne peuvent pas être référencés dans du code programme réel. De même, les identificateurs Object Pascal ne peuvent pas être référencés dans des directives conditionnelles autres que {$IF} et {$ELSEIF}.

Remarque : Les définitions conditionnelles sont seulement évaluées lorsque le code source est recompilé. Si vous changez le statut d'un symbole conditionnel puis reconstruisez un projet, le code source des unités non modifiées risque de ne pas être recompilé. Utilisez Projet > Construire tous les projets pour être sûr que chaque élément de votre projet reflète le statut en cours des symboles conditionnels.

Les constructions de directives conditionnelles peuvent être imbriquées sur 32 niveaux. Pour tout {$IFxxx}, le {$ENDIF} ou {$IFEND} correspondant doit être dans le même fichier source. Les symboles conditionnels doivent commencer par une lettre, suivie par n'importe quelle combinaison de lettres, chiffres et caractères soulignés ; ils peuvent avoir n'importe quelle longueur, mais seuls les 255 premiers caractères sont significatifs.

Conditions prédéfinies

Les symboles conditionnels standard suivants sont définis :

Catégorie Symbole Win32   Win64   Mac OS X   Périphérique iOS   Simulateur iOS   Android Commentaires
Compilateur DCC DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI
VER280

Pour consulter la liste des versions du compilateur, voir Versions du compilateur.
DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI
Plate-forme CONSOLE DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI Défini si une application est compilée en tant qu'application console.
IOS non défini non défini non défini DEFINI DEFINI N/A Défini si la plate-forme cible est iOS.
NATIVECODE DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI Depuis Object Pascal.Net
MSWINDOWS DEFINI DEFINI non défini non défini non défini non défini Indique que l'environnement d'exploitation est Windows. Utilisez MSWINDOWS pour tester toutes les variantes de la plate-forme Windows, au lieu de WIN32.
WIN32 DEFINI non défini non défini non défini non défini non défini La plate-forme cible est la plate-forme Windows 32 bits native.
WIN64 non défini DEFINI non défini non défini non défini non défini La plate-forme cible est Windows 64 bits.
MACOS non défini non défini DEFINI DEFINI DEFINI non défini La plate-forme cible est Mac OS X
MACOS32 non défini non défini DEFINI DEFINI DEFINI non défini La plate-forme cible est Mac OS X 32 bits.
LINUX non défini non défini non défini non défini non défini non défini Depuis Kylix
LINUX32 non défini non défini non défini non défini non défini non défini Depuis Kylix
POSIX non défini non défini DEFINI DEFINI DEFINI DEFINI Depuis Kylix
POSIX32 non défini non défini DEFINI DEFINI DEFINI DEFINI Depuis Kylix
ANDROID non défini non défini non défini non défini non défini DEFINI Défini si la plate-forme cible est Android.
CPU CPUARM non défini non défini non défini DEFINI non défini DEFINI Défini si la CPU est basée sur l'architecture ARM, telle que le compilateur mobile Object Pascal pour le périphérique iOS (DCCIOSARM.EXE).
CPU386 DEFINI non défini DEFINI non défini DEFINI non défini Indique que la CPU est un Intel 386 ou supérieur.
CPUX86 DEFINI non défini DEFINI non défini DEFINI non défini La CPU est un Intel 386 ou supérieur sur n'importe quelle plate-forme.
CPUX64 non défini DEFINI non défini non défini non défini non défini La CPU est un environnement 64 bits, tel que DCC64.EXE.
Disponibilité
ALIGN_STACK non défini non défini DEFINI non défini DEFINI non défini Défini dans du code qui peut être partagé avec le compilateur OS X et un autre compilateur sur une autre plate-forme telle que Linux n'ayant pas une exigence d'alignement de pile rigide.
ASSEMBLER DEFINI DEFINI DEFINI non défini DEFINI non défini La syntaxe assembleur est acceptée.
AUTOREFCOUNT non défini non défini non défini DEFINI DEFINI DEFINI Défini pour les compilateurs qui utilisent le comptage automatique des références, tels que les compilateurs mobiles Object Pascal.
EXTERNALLINKER non défini non défini non défini DEFINI non défini DEFINI Défini pour les compilateurs ayant un lien externe et le générateur de code LLVM ; les compilateurs mobiles Object Pascal ont le lieur ld externe et utilisent LLVM comme générateur de code.
UNICODE DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI UNICODE est défini comme le type chaîne par défaut.
CONDITIONALEXPRESSIONS DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI Teste l'utilisation de la directive $IF.
ELF non défini non défini non défini +DEFINI+ non défini non défini Défini si le ciblage s'applique à des fichiers ELF (Executable and Linkable Format).
NEXTGEN non défini non défini non défini DEFINI DEFINI DEFINI Défini pour les compilateurs (tels que les compilateurs mobiles Object Pascal) qui utilisent les fonctionnalités de langage de "nouvelle génération", telles que les chaînes basées sur 0.
PC_MAPPED_EXCEPTIONS non défini non défini DEFINI non défini DEFINI non défini Défini lors de la compilation sur une plate-forme ou pour une plate-forme cible qui utilise les mappages d'adresses au lieu de cadres de piles pour dérouler les exceptions (comme OS X).
PIC jamais jamais DEFINI si -P est spécifié jamais DEFINI si -P est spécifié toujours défini Défini pour les plates-formes qui nécessitent du code PIC (Position-Independent Code), comme OS X.
UNDERSCOREIMPORTNAME DEFINI non défini DEFINI non défini DEFINI non défini Défini pour les compilateurs qui ajoutent un caractère de soulignement de tête (par exemple, dans les noms des bibliothèques dynamiques importées depuis Mac OS).
WEAKREF non défini non défini non défini DEFINI DEFINI DEFINI Défini pour les compilateurs qui utilisent des références faibles (l'attribut [weak]).
WEAKINSTREF non défini non défini non défini DEFINI DEFINI DEFINI Défini quand des références faibles sont définies pour les instances.
WEAKINTREF non défini non défini non défini DEFINI DEFINI DEFINI Défini quand des références faibles sont définies pour les interfaces.


Utilisation des définitions conditionnelles pour la version du compilateur

Par exemple, pour déterminer la version du compilateur et de la bibliothèque d'exécution utilisés pour compiler votre code, vous pouvez utiliser {$IF} avec CompilerVersion, RTLVersion et d'autres constantes :

 {$IFDEF CONDITIONALEXPRESSIONS}
    {$IF CompilerVersion >= 19.5}
      {$DEFINE HAS_INLINE}
    {$IFEND}
    {$IF RTLVersion >= 20.0}
      {$DEFINE HAS_ERROUTPUT}
    {$IFEND}
 {$ENDIF}


Constantes prédéfinies

Les constantes peuvent être plus puissantes que les conditions car vous pouvez utiliser les constantes par programmation dans du code Object Pascal. En revanche, les conditions sont seulement acceptées dans les directives de compilation conditionnelle, telles que {$IF} et {$IFDEF}.

Trois constantes importantes sont disponibles :

  • System.RTLVersion est une constante définie comme la version de la bibliothèque d'exécution. Pour Appmethod 1.15, RTLVersion est égal à 28.
  • System.CompilerVersion est une constante définie comme la version du compilateur Object Pascal en cours. Pour Appmethod 1.15, CompilerVersion est égal à 28.
  • FMX.Types.FireMonkeyVersion est une constante définie comme la version de la bibliothèque FireMonkey en cours. Pour Appmethod 1.15, FireMonkeyVersion est égal à 21.0.

Voir aussi