Compilation conditionnelle (Delphi)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Liste des directives de compilation Delphi - 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 Delphi).
  • Ajoutez le symbole au champ Définitions conditionnelles sur la page Projet > Options > Compilateur Delphi.

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 Delphi 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 Delphi 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}

Modèle:Remarque

Modèle:Remarque

Modèle:Remarque

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 DCC32   DCC64  
  Depuis XE2  
  DCCOSX  
  Depuis XE2  
  DCCIOSARM  
  Since XE3  
  DCCIOS32  
  Depuis XE3  
  DCCAARM  
Dans XE5
  DCCIOSARM64  
  Since XE8  
  DCCLINUX64  
  Depuis 10.2 Tokyo  
Commentaires
Compilateur DCC DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI
VER340
Pour consulter la liste des versions du compilateur, voir Versions du compilateur.
DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI Pour Delphi Sydney, la version du compilateur 34.0 est définie sur VER340.
Plate-forme CONSOLE DEFINI DEFINI 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 DEFINI non défini Défini si la plate-forme cible est iOS.
*Nouveau* dans XE4/iOS
IOS32 non défini non défini non défini DEFINI DEFINI non défini non défini non défini Défini si la plate-forme cible est iOS32.
Depuis XE8/iOSarm64
IOS64 non défini non défini non défini non défini non défini non défini DEFINI non défini Défini si la plate-forme cible est iOS64.
Depuis XE8/iOSarm64
NATIVECODE DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI Depuis Delphi.Net
MSWINDOWS DEFINI DEFINI non défini non défini 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 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 non défini non défini La plate-forme cible est Windows 64 bits.
*Nouveau* dans XE2/x64
MACOS non défini non défini DEFINI DEFINI DEFINI non défini DEFINI non défini La plate-forme cible est macOS.
*Nouveau* dans XE2/macOS
MACOS32 non défini non défini DEFINI DEFINI DEFINI non défini non défini non défini La plate-forme cible est macOS 32 bits.
*Nouveau* dans XE2/macOS
MACOS64 non défini non défini non défini non défini non défini non défini DEFINI non défini La plate-forme cible est macOS 64 bits.
*Nouveau* dans XE8/macOS
LINUX non défini non défini non défini non défini non défini non défini non défini DEFINI Depuis Kylix
LINUX32 non défini non défini non défini non défini non défini non défini non défini non défini Depuis Kylix
LINUX64 non défini non défini non défini non défini non défini non défini non défini DEFINI Nouveauté dans 10.2
POSIX non défini non défini DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI Depuis Kylix
POSIX32 non défini non défini DEFINI DEFINI DEFINI DEFINI DEFINI non défini Depuis Kylix
POSIX64 non défini non défini non défini non défini non défini non défini DEFINI DEFINI Depuis Kylix
ANDROID non défini non défini non défini non défini non défini DEFINI non défini non défini Défini si la plate-forme cible est Android.
*Nouveau* dans XE5
ANDROID32 non défini non défini non défini non défini non défini DEFINI non défini non défini Depuis XE8/iOSarm64
CPU CPU386 DEFINI non défini DEFINI non défini DEFINI non défini non défini non défini Indique que le CPU est un Intel 386 ou supérieur.
CPUX86 DEFINI non défini DEFINI non défini DEFINI non défini non défini non défini Le CPU est un Intel 386 ou supérieur sur n'importe quelle plate-forme.
*Nouveau* dans XE2/x64
CPUX64 non défini DEFINI non défini non défini non défini non défini non défini DEFINI Le CPU prend en charge le jeu d'instructions x86-64 et se trouve dans un environnement 64 bits.
*Nouveau* dans XE2/x64
CPU32BITS DEFINI non défini DEFINI DEFINI DEFINI DEFINI non défini non défini Le CPU se trouve dans un environnement 32 bits, tel que DCC32.EXE.
*Nouveau* dans XE8
CPU64BITS non défini DEFINI non défini non défini non défini non défini DEFINI DEFINI Le CPU se trouve dans un environnement 64 bits, tel que DCC64.EXE.
*Nouveau* dans XE8
CPUARM non défini non défini non défini DEFINI non défini DEFINI DEFINI non défini Défini si le CPU est basé sur l'architecture ARM, tel que le compilateur mobile Delphi pour le périphérique iOS (DCCIOSARM.EXE).
*Nouveau* dans XE4/iOS
CPUARM32 non défini non défini non défini DEFINI non défini DEFINI non défini non défini Le CPU se trouve dans un environnement ARM 32 bits, tel que DCCIOSARM64.EXE.
*Nouveau* dans XE8
CPUARM64 non défini non défini non défini non défini non défini non défini DEFINI non défini Le CPU se trouve dans un environnement ARM 64 bits, tel que DCCIOSARM64.EXE.
*Nouveau* dans XE8
Disponibilité
ALIGN_STACK non défini non défini DEFINI non défini DEFINI non défini non défini non défini Défini dans du code qui peut être partagé avec le compilateur macOS et un autre compilateur sur une autre plate-forme telle que Linux n'ayant pas une exigence d'alignement de pile rigide. Pour de plus amples informations, voir le blog de Eli Boling sur http://blogs.embarcadero.com/eboling/2009/05/20/5607 (EN).
*Nouveau* dans XE2/macOS
ASSEMBLER DEFINI DEFINI DEFINI non défini DEFINI non défini non défini non défini La syntaxe assembleur est acceptée.
AUTOREFCOUNT non défini non défini non défini DEFINI DEFINI DEFINI DEFINI DEFINI si 10.2.
Non défini depuis 10.3.
Défini pour les compilateurs qui utilisent le comptage automatique des références, tels que les compilateurs mobiles Delphi.
*Nouveau* dans XE4/iOS
EXTERNALLINKER non défini non défini non défini DEFINI non défini DEFINI DEFINI DEFINI Défini pour les compilateurs ayant un lien externe et le générateur de code LLVM ; les compilateurs mobiles Delphi ont le lieur ld externe et utilisent LLVM comme générateur de code.
*Nouveau* dans XE4/iOS
UNICODE DEFINI DEFINI 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 DEFINI DEFINI Teste l'utilisation de la directive $IF.
ELF non défini non défini non défini non défini non défini non défini non défini DEFINI 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 DEFINI DEFINI si 10.2.
Non défini depuis 10.3.
Défini pour les compilateurs (tels que les compilateurs mobiles Delphi) qui utilisent les fonctionnalités de langage de "nouvelle génération", telles que les chaînes basées sur 0.
*Nouveau* dans XE4/iOS
PC_MAPPED_EXCEPTIONS non défini non défini DEFINI non défini DEFINI non défini non défini 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 macOS).
*Nouveau* dans XE2
PIC jamais jamais toujours DEFINI toujours DEFINI toujours DEFINI toujours DEFINI toujours DEFINI toujours DEFINI Défini pour les plates-formes qui nécessitent du code PIC (Position-Independent Code), comme macOS.
UNDERSCOREIMPORTNAME DEFINI non défini DEFINI non défini DEFINI non défini non défini 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).
*Nouveau* dans XE4/iOS
WEAKREF DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI Défini pour les compilateurs qui utilisent des références faibles (l'attribut [weak]).
*Nouveau* dans XE4/iOS
WEAKINSTREF non défini non défini non défini DEFINI DEFINI DEFINI DEFINI DEFINI si 10.2.
Non défini depuis 10.3.
Défini quand des références faibles sont définies pour les instances.
*Nouveau* dans XE4/iOS
WEAKINTFREF DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI Défini quand des références faibles sont définies pour les interfaces.
*Nouveau* dans XE4/iOS

Dans les en-têtes de colonnes du tableau :

  • DCC32 est le compilateur Delphi Windows 32 bits.
  • DCC64 est le compilateur Delphi Windows 64 bits.
  • DCCOSX est le compilateur Delphi macOS.
  • DCCIOSARM est le compilateur Delphi pour les périphériques iOS 32 bits.
  • DCCIOS32 est le compilateur Delphi pour les simulateurs iOS.
  • DCCAARM.EXE est le compilateur Delphi pour les périphériques Android.
  • DCCIOSARM64 est le compilateur Delphi pour les périphériques iOS 64 bits.
  • DCCLINUX64 est le compilateur Delphi Linux 64 bits.

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 >= 17.0}
      {$DEFINE HAS_INLINE}
    {$IFEND}
    {$IF RTLVersion >= 14.0}
      {$DEFINE HAS_ERROUTPUT}
    {$IFEND}
 {$ENDIF}

Voir le tableau des versions du compilateur pour obtenir la liste des numéros de version associés aux diverses releases du compilateur Delphi.

Constantes prédéfinies

Les constantes peuvent être plus puissantes que les conditions car vous pouvez utiliser les constantes par programmation dans du code Delphi. 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 Sydney, RTLVersion est égal à 34.
  • System.CompilerVersion est une constante définie comme la version du compilateur Delphi en cours. Pour Sydney, CompilerVersion est égal à 34.
  • FMX.Types.FireMonkeyVersion est une constante définie comme la version de la bibliothèque FireMonkey en cours. Pour Sydney, FireMonkeyVersion est égal à 270.

Voir aussi