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
DCCOSX64
Depuis 10.3 Rio Release 2
DCCAARM
Dans XE5
DCCIOSARM64
Depuis XE8
DCCLINUX64
Depuis 10.2 Tokyo
DCCAARM64
Depuis 10.3 Rio Release 3
DCCOSXARM64
Depuis 11.0 Alexandria Release
DCCIOSSIMARM64
Depuis 11.2 Alexandria Release
Commentaires
Compilateur DCC DEFINED DEFINED DEFINED DEFINED DEFINED DEFINED DEFINED DEFINED DEFINED
VER350
Pour consulter la liste des versions du compilateur, voir Versions du compilateur.
DEFINED DEFINED DEFINED DEFINED DEFINED DEFINED DEFINED DEFINED DEFINED Pour Delphi Alexandria, la version du compilateur 35.0 est définie sur VER350.
Plate-forme CONSOLE DEFINI 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 N/A DEFINI non défini non défini non défini DEFINI Défini si la plate-forme cible est iOS.
*Nouveau* dans XE4/iOS.
IOS64 non défini non défini non défini non défini DEFINI non défini non défini non défini DEFINI Défini si la plate-forme cible est iOS64.
Depuis XE8/iOSarm64.
OSX non défini non défini DEFINI non défini non défini non défini non défini DEFINI non défini Défini si la plate-forme cible est macOS.
*Nouveau* dans XE2/macOS.
OSX64 non défini non défini DEFINI non défini non défini non défini non défini DEFINI non défini Défini si la plate-forme cible est macOS.
*Nouveau* dans 10.3.2.
NATIVECODE DEFINI 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 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 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 non défini La plate-forme cible est Windows 64 bits.
*Nouveau* dans XE2/x64.
MACOS non défini non défini DEFINI non défini DEFINI non défini non défini DEFINI DEFINI La plate-forme cible est un système d'exploitation Apple Darwin (macOS ou iOS).
Remarque: Ce symbole existait avant qu'Apple remplace le nom OS X par macOS.
*Nouveau* dans XE2/macOS.
MACOS32 non défini non défini 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 un système d'exploitation Apple Darwin 32 bits (macOS 32 bits ou iOS 32 bits).
Remarque: Ce symbole existait avant qu'Apple remplace le nom OS X par macOS.
*Nouveau* dans XE2/macOS.
MACOS64 non défini non défini DEFINI non défini DEFINI non défini non défini DEFINI DEFINI La plate-forme cible est un système d'exploitation Apple Darwin 64 bits (macOS 64 bits ou iOS 64 bits).
Remarque: Ce symbole existait avant qu'Apple remplace le nom OS X par macOS.
*Nouveau* dans XE8/macOS.
LINUX non défini non défini non défini non défini non défini DEFINI 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 non défini non défini Depuis Kylix.
LINUX64 non défini non défini non défini non défini non défini DEFINI non défini non défini non défini Nouveauté dans 10.2
POSIX non défini non défini DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI Depuis Kylix.
POSIX32 non défini non défini non défini DEFINI DEFINI non défini non défini non défini non défini Depuis Kylix.
POSIX64 non défini non défini DEFINI non défini DEFINI DEFINI DEFINI DEFINI DEFINI Depuis Kylix.
ANDROID non défini non défini non défini DEFINI 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 DEFINI non défini non défini non défini non défini non défini Depuis XE8/iOSarm64.
ANDROID64 non défini non défini non défini non défini non défini non défini DEFINI non défini non défini Compilateur Delphi pour plate-forme Android 64 bits.
*Nouveau* dans 10.3.3.
CPU CPU386 DEFINI non défini DEFINI non défini non défini non défini 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 non défini non défini non défini non défini 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 DEFINI non défini non défini DEFINI 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 non défini DEFINI non défini non défini non défini 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 DEFINI non défini DEFINI DEFINI DEFINI 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 DEFINI non défini DEFINI DEFINI DEFINI Défini si le CPU est basé sur l'architecture ARM.
*Nouveau* dans XE4/iOS.
CPUARM32 non défini non défini non défini DEFINI non défini non défini non défini non défini non défini Le CPU se trouve dans un environnement ARM 32 bits.
*Nouveau* dans XE8.
CPUARM64 non défini non défini non défini non défini DEFINI non défini DEFINI DEFINI 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 non défini non défini non défini non défini 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.
*Nouveau* dans XE2/macOS.
ASSEMBLER DEFINI DEFINI non défini non défini non défini non défini non défini non défini non défini La syntaxe assembleur est acceptée.
AUTOREFCOUNT (*) non défini non défini DEFINI DEFINI DEFINI non défini DEFINI si 10.2.
Non défini depuis 10.3.
non défini non défini Défini pour les compilateurs qui utilisent le comptage automatique des références, tels que les compilateurs mobiles Delphi.
*Nouveau* dans XE4/iOS. Supprimé dans 10.4 Sydney.
EXTERNALLINKER non défini non défini DEFINI DEFINI DEFINI DEFINI 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 DEFINED DEFINI UNICODE est défini comme le type chaîne par défaut.
CONDITIONALEXPRESSIONS DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI DEFINI DEFINED DEFINI Teste l'utilisation de la directive $IF.
ELF non défini non défini non défini non défini non défini DEFINI 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 DEFINI DEFINI DEFINI DEFINI si 10.2.
Non défini depuis 10.3.
non défini non défini non défini 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. Supprimé dans 10.4 Sydney.
PC_MAPPED_EXCEPTIONS non défini non défini non défini non défini non défini non défini 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 toujours DEFINI Défini pour les plates-formes qui nécessitent du code PIC (Position-Independent Code), comme macOS.
UNDERSCOREIMPORTNAME DEFINI non défini non défini non défini non défini non défini 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 DEFINI Défini pour les compilateurs qui utilisent des références faibles (l'attribut [weak]).
*Nouveau* dans XE4/iOS.
WEAKINSTREF (*) DEFINED DEFINED non défini non défini non défini DEFINI non défini DEFINI DEFINI Défini quand des références faibles sont définies pour les instances.
*Nouveau* dans XE4/iOS. Supprimé dans 10.4 Sydney.
WEAKINTFREF DEFINI 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.


Attention: Les symboles suivis d'un astérisque (*) ont été définis antérieurement pour les compilateurs mobiles Delphi, mais ont été supprimés dans RAD Studio 10.4 Sydney dans le cadre de la suppression du modèle de mémoire ARC.

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

Variables conditionnelles de framework

Les conditionnelles suivantes sont disponibles depuis RAD Studio 11.1 :

Catégorie Symbole Commentaires
Framework FRAMEWORK_VCL Défini si le projet utilise le framework VCL.
FRAMEWORK_FMX Défini si le projet utilise le framework FMX.

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

Voir aussi