Ceci est une ancienne révision du document !


Directives de compilation

{$H} / {$LONGSTRINGS}

{$H+} → String = AnsiString
{$H-} → String = ShortString

Si {$LONGSTRINGS ON} est spécifié, le mot-clé String (sans spécification de longueur) sera traité comme AnsiString.

Ce commutateur correspond à l'option de ligne de commande -Sh.

Par défaut, l'utilisation des ansistrings est désactivée, ce qui correspond à {$H-}.

L'unité du système est compilée sans ansistrings, toutes ses fonctions acceptent des arguments à courte chaîne. Il en va de même pour toutes les unités RTL, sauf l'unité sysutils, qui est compilée avec ansistrings.

Cependant, l'instruction {$MODE} influence la valeur par défaut de {$H} :
une directive {$MODE DELPHI} implique une instruction {$H+},
tous les autres modes la désactivent.
Par conséquent, vous devez toujours mettre {$H+} après une directive mode.

{$i} / {$INCLUDE}

La directive {$I filename} ou {$INCLUDE filename} indique au compilateur d'inclure les fichier filename. Les instructions lues à cet endroit seront insérées comme si elles se trouvaient dans le fichier actuel.

Si aucune extension n'est donnée, le compilateur ajoutera l'extension .pp au fichier et essaiera avec ce nom de fichier. Aucune autre extension n'est essayée.

Si le nom de fichier contient un espace, il doit être entouré de guillemets simples : {$I 'my file name'}

Si le nom du fichier est un astérisque (*), le compilateur utilisera le nom de l'unité ou du programme comme nom de fichier et essaiera de l'inclure. Le code suivant

unit testi ;  
interface  
{$I *}  
implementation
end.

incluera le fichier testi ou testi.pp s'ils existent.

Il faut faire attention à ce mécanisme, car le nom de l'unité devrait déjà correspondre au nom de fichier de l'unité, ce qui signifie que l'unité s'inclura très probablement de manière récursive.

Les fichiers inclus peuvent être imbriqués, mais pas à l'infini. Le nombre de fichiers est limité au nombre de descripteurs de fichiers disponibles pour le compilateur Free Pascal.

Contrairement au Turbo Pascal, les fichiers d'inclusion peuvent traverser des blocs. C'est-à-dire qu'un bloc peut commencer dans un fichier (avec un mot-clé Begin) et peut se terminer dans un autre (avec un mot-clé End).

La plus petite entité dans un fichier include doit être un jeton, c'est-à-dire un identifiant, un mot-clé ou un opérateur.

Le compilateur cherchera le fichier à inclure dans les emplacements suivants :

  • Il cherchera dans le chemin spécifié dans le nom du fichier d'inclusion.
  • Il cherchera dans le répertoire où se trouve le fichier source actuel.
  • il recherchera dans tous les répertoires spécifiés dans le chemin de recherche du fichier d'inclusion.

Les répertoires peuvent être ajoutés au chemin de recherche du fichier à inclure avec l'option de ligne de commande -Fi.

Source : https://www.freepascal.org/docs-html/prog/progsu40.html

{$M+} / {$TYPEINFO ON}

Pour les classes qui sont compilées dans l'état {$M+} ou {$TYPEINFO ON}, le compilateur générera des informations sur le type d'exécution (RTTI).

Exemple:

{$M+}
  TPersistent = class(TObject,IFPObserved)
  private
  ...
  end;
{$M-}           

Toutes les classes descendantes d'une classe qui a été compilée dans l'état {$M+} recevront également des informations RTTI.
Toute classe qui est utilisée comme champ ou propriété dans une section publiée obtiendra également des informations RTTI.

Par défaut, aucune information de type Run-Time n'est générée pour les sections published, ce qui les rend équivalentes aux sections publiques.
Ce n'est que lorsqu'une classe (ou l'une de ses classes parentes) a été compilée dans l'état {$M+} que le compilateur génère des informations RTTI pour les méthodes et les propriétés de la section publiée.

L'objet TPersistent qui est présent dans l'unité de classes est généré dans l'état {$M+}.

La génération de RTTI permet aux programmeurs de diffuser des objets en continu et d'accéder aux propriétés publiées des objets, sans connaître la classe réelle de l'objet. L'information sur le type d'exécution est accessible par l'unité TypInfo, qui fait partie de la bibliothèque d'exécution Free Pascal.

Remarque : Le système de diffusion en continu mis en œuvre par Free Pascal exige que tous les composants diffusables en continu soient des descendants de TPersistent. Il est possible de créer des classes avec des sections publiées qui ne descendent pas de TPersistent, mais ces classes ne seront pas diffusées correctement par le système de diffusion en continu de l'unité Classes.

Source:https://www.freepascal.org/docs-html/prog/progsu47.html

{$MODESWITCH}

La directive {$MODESWITCH } permet d'activer ou de désactiver les fonctionnalités du mode individuel sans modifier le mode de compilation actuel.

Ce commutateur est un commutateur global, et peut être utilisé partout où le commutateur {$MODE} peut être utilisé.

La syntaxe est la suivante :

{$MODESWITCH XXX} // Active
{$MODESWITCH XXX+}  // identique à  {$MODESWITCH XXX}
{$MODESWITCH XXX-}  // Désactive

La fonction XXX peut être l'une des suivantes :

CLASSE

Utilisez les classes pascal object.

OBJPAS

Inclure automatiquement l'unité ObjPas.

RESULT

Activez l'identificateur de result pour les résultats des fonctions.

PCHARTOSTRING

Permettre la conversion automatique des chaînes de caractères à terminaison nulle en chaînes de caractères,

CVAR

Autoriser l'utilisation du mot-clé CVAR.

NESTEDCOMMENTS

Permettre l'utilisation de commentaires imbriqués.

CLASSICPROCVARS

Utiliser les variables procédurales classiques.

MACPROCVARS

Utiliser des variables procédurales de type mac.

REPEATFORWARD

La déclaration de mise en œuvre et la déclaration de transmission doivent correspondre complètement.

POINTERTOPROCVAR

Permettre la conversion silencieuse des pointeurs en variables procédurales.

AUTODEREF

Déréférencement automatique (silencieux) des pointeurs dactylographiés.

INITFINAL

Permettre l'utilisation de l'initialisation et de la finalisation

ANSISTRINGS

Autoriser l'utilisation des ansistrings.

OUT

Permet d'utiliser le type de paramètre out.

DEFAULTPARAMETERS

Permettre l'utilisation de valeurs de paramètres par défaut.

HINTDIRECTIVE

Soutenir les directives d'indication (déprédation, plate-forme, etc.)

DUPLICATELOCALS

Permettre aux variables locales des méthodes de classe d'avoir les mêmes noms que les propriétés de la classe.

PROPERTIES

Autoriser l'utilisation des biens.

ALLOWINLINE

Autoriser les procédures en ligne.

EXCEPTIONS

Permettre le recours à des exceptions.

ADVANCEDRECORDS

permettre l'utilisation d'enregistrements avancés (c'est-à-dire des enregistrements avec des méthodes)

Exemple:

  TQRange = packed record
  private
    FLeft: QWord;
    FRight: QWord;
    FWidth: QWord;
	 procedure SetLeft(AValue: QWord);
	 procedure SetRight(AValue: QWord);
	 procedure SetWidth(AValue: QWord);
  public
    property Left: QWord read FLeft write SetLeft;
    property Right: QWord read FRight write SetRight;
    property Width: QWord read FWidth write SetWidth;
    class operator in (const AValue: QWord;const ARange: TQRange): boolean;
    class operator in (const ARange1,ARange2: TQRange): boolean;
    class operator in (const ARect: TRect;const ARange: TQRange): boolean;
  end;
UNICODESTRINGS

est par défaut une chaîne unicode.

TYPEHELPERS

Autoriser l'utilisation d'aides à la saisie.

CBLOCKS

Blocs de style C.

ISOIO

entrée/sortie comme requis par l'ISO pascal.

ISOPROGRAMPARAS

Paramètres de programme tels que requis par l'ISO pascal.

ISOMOD

mod comme requis par l'ISO pascal.

ISOUNARYMINUS

Unary moins comme requis par l'ISO pascal.

Vous pourriez laisser un commentaire si vous étiez connecté.