Directive de compilation
Le QuickPascal utilise une variété de directives du compilateur pour affecter la sortie du code. Ils peuvent être classés comme ceci :
- Directives de commutation (interrupteurs on et off contrôlant les options du compilateur)
- Directives de paramètre (commandes nécessitant des nombres ou un nom de fichier)
- Directives conditionnelles (commandes compilant des parties spécifiques du fichier source, selon que certaines conditions sont remplies)
Les directives du compilation peuvent être spécifiées dans le fichier source, dans l'environnement QuickPascal ou sur la ligne de commande DOS.
Directives de commutation
Les directives de commutation sont identifiées par une seule lettre entre accolades. La lettre est précédée du signe dollar ($) et est suivie soit d'un plus (+) activant le commutateur, soit d'un moins (-) le désactivant. Si vous ne spécifiez pas de directive de commutation, le paramètre par défaut sera automatiquement utilisé.
Il ne doit pas y avoir d'espace entre l'accolade gauche et le signe dollar. Si c'est le cas, le compilateur considère la ligne comme un commentaire. Ceci est utile pour commenter les directives.
Plusieurs commutateurs peuvent être définis dans une seule instruction. Par exemple:
- {$A-,S+,R-,V+}
Certaines directives de commutation doivent être déclarées globalement en début de programme, juste après l'entête. Autrement dit, ils doivent apparaître avant toute déclaration de données ou code. D'autres directives de commutateur peuvent se produire localement, n'importe où dans le fichier source.
Les directives de commutation individuelles sont décrites ci-dessous :
Aligner les données
{$A+} ou {$A-}
Par défaut : {$A+}
Type : Local
Passe de l'alignement des octets à l'alignement des mots des constantes et des variables typées. Lorsque la directive d'alignement de données est activée, toutes les constantes et variables typées supérieures à un octet sont alignées sur une limite de mot machine. Bien que l'alignement des mots n'affecte pas l'exécution du programme sur le microprocesseur 8088, sur les microprocesseurs 80x86, les programmes peuvent s'exécuter plus rapidement car les éléments de la taille d'un mot sont accessibles en un cycle de mémoire.
Lorsque la directive est désactivée, aucun alignement ne se produit et toutes les constantes et variables typées sont placées à la prochaine adresse mémoire disponible.
Évaluation booléenne
{$B+} ou {$B-}
Par défaut : {$B-}
Type : Local
Détermine quel type de code sera généré pour les opérateurs booléens AND et OR. Lorsque la directive est activée, le code est créé pour l'expression booléenne complète, même si le résultat est déjà connu. Si la directive est désactivée (valeur par défaut), l'évaluation s'arrête dès que le résultat devient évident, ce qui entraîne des programmes plus rapides. Activez ce commutateur lorsque le deuxième opérande ou les suivants de l'expression booléenne incluent un appel de procédure ou de fonction qui doit être exécuté, quelle que soit la valeur du premier opérande.
Informations de débogage
{$D+} ou {$D-}
Par défaut : {$D+}
Type : Global
Insère des informations de débogage dans votre programme compilé. Lorsque la directive est activée, vous pouvez utiliser le débogueur QuickPascal pour parcourir le code pas à pas pour afficher VARS, vous avez besoin de {$L+}. De plus, lorsqu'une erreur d'exécution est signalée, QuickPascal se déplace vers la ligne du code source ayant provoqué l'erreur.
Appels long (FAR)
{$F+} ou {$F-}
Par défaut : {$F-}
Type : Local
Détermine quel modèle est utilisé pour les procédures et les fonctions compilées. Lorsque la directive d'appels long est activée, les procédures et les fonctions utilisent toujours le modèle d'appel long (FAR). Si la directive est désactivée, QuickPascal détermine le modèle d'appel en fonction de l'emplacement de la routine. Si la procédure ou la fonction est déclarée dans la partie INTERFACE d'une unité, le modèle FAR est utilisé. Sinon, le modèle NEAR est utilisé.
Voir la page «Sujets avancés», pour une discussion complète des modèles d'appel FAR et NEAR.
Vérification des entrées/sorties
{$I+} ou {$I-}
Par défaut : {$I+}
Type : Local
Génère du code examinant le résultat d'une procédure d'entrée/sortie. Si une erreur d'entrée/sortie se produit alors que la directive est activée, le programme affiche une erreur d'exécution et se termine. Si la directive de vérification d'entrée/sortie est désactivée, vous devez utiliser la fonction IOResult pour vérifier les erreurs d'entrées/sorties. Reportez-vous à la page «Fichiers texte», pour plus d'informations sur les routines d'entrée/sorties.
Données de symboles locaux
{$L+} ou {$L-}
Par défaut : {$L+}
Type : Global
Génère des informations sur les symboles dans votre code compilé. Lorsque la directive est activée, vous pouvez utiliser le débogueur QuickPascal pour examiner et modifier des variables dans votre programme. La directive de données de symboles locaux est utilisée conjointement avec la directive d'informations de débogage. Si la directive d'informations de débogage est désactivée, la directive de données de symboles locaux est automatiquement désactivée.
Vérification de la méthode
{$M+} ou {$M-}
Par défaut : {$M-}
Type : Global
Détermine si la mémoire d'un objet a été allouée avant l'appel de la méthode d'un objet. Si la directive est activée et qu'un objet n'a pas de mémoire allouée, une erreur d'exécution est générée. Vous devez toujours activer la directive de vérification de méthode lorsque vous utilisez des objets et que vous programmez en Pascal orienté objet.
Traitement numérique
{$N+} ou {$N-}
Par défaut : {$N-}
Type : Global
Spécifie quel modèle de code à virgule flottante est généré par le compilateur. Lorsque la directive est activée, tous les calculs en virgule flottante sont effectués par le coprocesseur mathématique 80x87. Si la directive est désactivée, tous les calculs de type réel sont effectués dans le logiciel à l'aide des bibliothèques d'exécution.
Lorsque la directive est activée {$N+}, le programme résultant ne fonctionnera que sur les machines équipées de coprocesseurs 80x87. Tenter d'exécuter le programme sur un ordinateur n'étant pas équipé de 80x87 génère un message d'erreur informant l'utilisateur qu'un coprocesseur est requis.
Lorsque la directive est désactivée {$N-}, le programme résultant s'exécutera sur n'importe quelle machine, qu'elle ait ou non un coprocesseur. Cependant, le code n'utilisera pas le coprocesseur, même s'il est présent. L'utilisation de la directive $N- implique certaines différences dans la manière dont les types de données Extended et Comp sont traités. Reportez-vous à la page «Bases de la programmation», pour plus d'informations.
Vérification d'intervalle
{$R+} ou {$R-}
Par défaut : {$R-}
Type : Local
Génère du code déterminant si toutes les expressions d'indexation de tableau et de chaîne de caractères sont dans les limites, et si toutes les affectations aux variables scalaires et de sous-intervalles sont dans l'intervalle. Si la vérification de plage échoue alors que la directive est activée, une erreur d'exécution est signalée. La directive de vérification de plage doit être utilisée uniquement pour le débogage, car elle diminue les performances du programme et augmente la taille du programme.
Vérification de la pile
{$S+} ou {$S-}
Par défaut : {$S+}
Type : Local
Crée du code qui vérifie s'il reste suffisamment d'espace sur la pile pour les variables locales avant d'exécuter une procédure ou une fonction. Si un débordement de pile se produit lorsque la directive est activée, le programme affiche un message d'erreur d'exécution et se termine.
Vérification des chaînes de caractères VAR
{$V+} ou {$V-}
Par défaut : {$V+}
Type : Local
Compare le type déclaré d'un paramètre de chaîne de caractères de type VAR avec le type de chaîne de caractères réellement transmis en tant que paramètre lorsque la directive est activée. Les types doivent être identiques. Si la directive est désactivée, aucune vérification de type n'est effectuée.
Directives de paramètre
Les directives de paramètre indiquent au compilateur d'effectuer une certaine action, en fonction des paramètres étant passés au compilateur. Un espace sépare toujours la lettre directive unique et le paramètre.
Les directives de paramètres individuelles sont décrites ci-dessous :
Inclusion
{$I Filename}
Type : Local
Inclut un fichier source nommé dans la compilation immédiatement après la directive. Le QuickPascal utilise l'extension .INC si aucune n'est spécifiée. Si le fichier inclus se trouve dans un chemin différent de celui défini dans la commande Environment de QuickPascal du menu Options, vous devez saisir le chemin complet.
Vous ne pouvez pas avoir un fichier d'inclusion dans un bloc BEGIN...END
Liaison
{$L ObjectFile}
Type : Local
Lie un fichier objet relocalisable contenant des routines externes écrites en langage assembleur. Si le fichier .OBJ se trouve dans un chemin différent de celui défini dans la commande Environment de QuickPascal du menu Options, vous devez saisir le chemin complet. Pour plus d'informations sur la liaison avec le langage d'assemblage, consultez la page «Sujets avancés».
Mémoire
{$M StackSize, MinHeap, MaxHeap}
Valeur par défaut : {$M 16384, 0, 655360}
Type : Global
Définit l'allocation de mémoire de pile et de la mémoire de tas. Trois paramètres sont passés : la taille de la pile, la taille minimale de la mémoire de tas et la taille maximale de la mémoire de tas. Chaque paramètre doit être un nombre entier dans un intervalle spécifique. Voir la liste des intervalles dans le tableau ci-dessous :
Paramètre | Valeur minimum | Valeur maximum |
---|---|---|
StackSize | 1024 | 65520 |
MinHeap | 0 | 655360 |
MaxHeap | MinHeap | 655360 |
Directives conditionnelles
Les directives conditionnelles produisent un code différent à partir du même fichier source si un identificateur conditionnel est défini. Les directives conditionnelles sont, en fait, une variante de l'instruction de contrôle IF. Si une condition est vraie, le code entre les directives {$IFxxx Condition} et {$ENDIF} est compilé. Si la condition est fausse, le compilateur ignore le code entre les deux directives. Une directive facultative {$ELSE} fournit un contrôle supplémentaire.
Vous définissez et annulez la définition des identifiants avec les directives {$DEFINE Name} et {$UNDEF Name}. Les identificateurs conditionnels sont traités séparément des constantes et des variables de programme portant le même nom. En plus des identificateurs de contrôle définis par l'utilisateur, QuickPascal intègre plusieurs identificateurs prédéfinis (énumérés dans le tableau ci-dessous) :
Identificateur conditionnel | État | Objectif |
---|---|---|
VER10 | Défini | Indique la version du compilateur |
MSDOS | Défini | Indique le système d'exploitation |
CPU86 | Défini | Indique la famille de processeurs 80x86 |
CPU87 | Défini si un 80x87 est présent au moment de la compilation | Indique l'utilisation d'un coprocesseur 80x87 |
Les directives conditionnelles peuvent être placées n'importe où dans le fichier source. Les directives conditionnelles individuelles sont décrites ci-dessous.
DEFINE
{$DEFINE Identifier} |
Définit un identificateur conditionnel. L'identificateur existe pendant le reste de la compilation, ou jusqu'à ce qu'il soit indéfini avec la directive UNDEF.
ELSE
{$ELSE} |
Compile ou ignore la source en fonction de l'identifiant dans la directive IF précédente.
ENDIF
{$ENDIF} |
Termine la compilation conditionnelle associée à la directive IF la plus récente.
IFDEF
{$IFDEF Identifier} |
Compile le source suivant si l'identificateur a été défini.
IFNDEF
{$IFNDEF Identifier} |
Compile la source suivant la directive si l'identificateur n'est pas défini.
IFOPT
{$IFOPT Switch} |
Compile la source suivante si le commutateur spécifié a été défini comme décrit. Par exemple :
- {$IFOPT I-}
- result:=IOResult;
- {SENDIF}
UNDEF
{$UNDEF Identifier} |
Annule la définition d'un identificateur précédemment déclaré pour le reste de la compilation ou jusqu'à ce que l'identifiant soit à nouveau défini.