Compilation conditionnelle (Delphi)
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.
Sommaire
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}
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
- Liste des directives de compilation Delphi - Index
- Versions du compilateur
- Exemple de code CompilerVersion_(Delphi)
- Directive IF (Delphi) et directive IFEND (Delphi)
- Directive IFDEF (Delphi) et directive ENDIF (Delphi)
- Déclarations et instructions (Delphi)
- Compilateurs Delphi
- Page Compilateur Delphi de Options du projet