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}

Remarque : Les symboles conditionnels ne sont pas des identificateurs Delphi et ne peuvent pas être référencés dans du code programme réel. De même, les identificateurs Delphi 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.

Remarque : Si vous modifiez le nom d'une définition conditionnelle dans Projet > Options > Compilateur Delphi, vous devez construire votre projet (Projet > Construire <NomProjet> ou appuyer sur Maj + F9) pour que les modifications prennent effet.

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  
  Depuis XE3  
  DCCIOS32  
  Depuis XE3  
  DCCAARM  
Dans XE5
  DCCIOSARM64  
  Depuis XE8  
Commentaires
Compilateur DCC DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI
VER310

Pour consulter la liste des versions du compilateur, voir Versions du compilateur.
DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI Pour Delphi Berlin, VER310 est défini pour la version 31.0 du compilateur.
Plate-forme CONSOLE 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 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 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 Défini si la plate-forme cible est iOS64.
Depuis XE8/iOSarm64
NATIVECODE 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 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 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 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 non défini La plate-forme cible est Mac OS X.
*Nouveau* dans XE2/OSX
MACOS32 non défini non défini DEFINI DEFINI DEFINI non défini non défini La plate-forme cible est Mac OS X 32 bits.
*Nouveau* dans XE2/OSX
MACOS64 non défini non défini non défini non défini non défini non défini DEFINI La plate-forme cible est Mac OS X 34 bits.
*Nouveau* dans XE8/OSX
LINUX non défini 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 non défini Depuis Kylix
POSIX non défini non défini DEFINI DEFINI DEFINI DEFINI DEFINI Depuis Kylix
POSIX32 non défini non défini DEFINI DEFINI DEFINI DEFINI DEFINI Depuis Kylix
POSIX64 non défini non défini non défini non défini non défini non défini DEFINI Depuis Kylix
ANDROID 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 Android.
*Nouveau dans XE5
ANDROID32 non défini non défini non défini non défini non défini DEFINI non défini Depuis XE8/iOSarm64
CPU CPU386 DEFINI non défini DEFINI non défini DEFINI 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 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 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 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 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 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 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 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 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. 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/OSX
ASSEMBLER DEFINI DEFINI DEFINI non défini DEFINI 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 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 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 UNICODE est défini comme le type chaîne par défaut.
CONDITIONALEXPRESSIONS 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 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 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 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).
*Nouveau* dans XE2
PIC jamais jamais DEFINI si -P est spécifié jamais DEFINI si -P est spécifié toujours défini jamais 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 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 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 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 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 Mac OS X.
  • 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.

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 Berlin, RTLVersion est égal à 31.
  • System.CompilerVersion est une constante définie comme la version du compilateur Delphi en cours. Pour Berlin, CompilerVersion est égal à 31.
  • FMX.Types.FireMonkeyVersion est une constante définie comme la version de la bibliothèque FireMonkey en cours. Pour Berlin, FireMonkeyVersion est égal à 24.

Voir aussi