Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
prog:lazarus:compilateur:directives:directives [01/05/2020 21:53]
thierry [{$i} / {$INCLUDE}]
prog:lazarus:compilateur:directives:directives [10/04/2023 16:13] (Version actuelle)
thierry [{$MODESWITCH}]
Ligne 1: Ligne 1:
 ====== Directives de compilation ====== ====== Directives de compilation ======
 Toutes les directives -> [[https://​www.freepascal.org/​docs-html/​prog/​progse2.html]] Toutes les directives -> [[https://​www.freepascal.org/​docs-html/​prog/​progse2.html]]
 +===== {$APPTYPE} =====
 +
 +
 +Il est possible de déterminer le type d'​application d'une application Windows ou Amiga au moment de l'​exécution. La constante IsConsole, déclarée dans les unités système Win32 et Amiga en tant que
 +<code delphi>
 +Const  ​
 +  IsConsole : boolean ;
 +  // contient True si l'​application est une application console, ​
 +  // False si l'​application est une application GUI.
 +
 +</​code>​
 +
 +
 +La directive {$APPTYPE XXX} accepte un argument qui spécifie le type d'​application compilée. Il peut prendre les valeurs suivantes :
 +
 +
 +==== CONSOLE ====
 +Une application console. Un terminal sera créé et les descripteurs de fichiers d'​entrée,​ de sortie et d'​erreur standard seront initialisés. Sous Windows, une fenêtre de terminal sera créée. Il s'agit de la valeur par défaut.
 +
 +Les applications linux sont toujours des applications de console. L'​application elle-même peut décider de fermer les fichiers standard. ​
 +==== FS ====
 +Spécifie une application VIO plein écran sur os/2. Ces applications utilisent une API spéciale de type BIOS pour programmer l'​écran. os/2 démarre ces applications toujours en plein écran. ​
 +
 +==== GUI ====
 +En spécifiant la directive ''​{$APPTYPE GUI}'',​ l'​application sera considérée comme une application graphique ; aucune fenêtre de console ne sera ouverte lors de l'​exécution de l'​application. Aucun descripteur de fichier standard ne sera initialisé,​ leur utilisation (avec par exemple des instructions writeln) produira une erreur d'​exécution. Si l'​application est lancée à partir de la ligne de commande, l'​invite de commande sera renvoyée immédiatement après le démarrage de l'​application.
 +
 +Sous os/2 et Mac OS, le type d'​application GUI crée une application GUI, comme sous Windows. Sur os/2, il s'agit d'une véritable application Presentation Manager. ​
 +
 +Il convient d'​être prudent lors de la compilation d'​applications GUI ; les fichiers Input et Output ne sont pas disponibles dans une application GUI, et toute tentative de lecture ou d'​écriture dans ces fichiers entraînera une erreur d'​exécution.
 +
 +
 +==== TOOL ====
 +
 +Il s'agit d'une directive spéciale pour Mac OS. Elle indique au compilateur de créer une application outil : Elle initialise les fichiers Input, Output et StdErr, elle peut prendre des paramètres et renvoyer un code de résultat. Elle est implémentée comme un outil MPW qui ne peut être exécuté que par MPW ou ToolServer.
 +
 +===== {$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} ===== ===== {$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. 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.
Ligne 35: Ligne 86:
  
 Source : [[https://​www.freepascal.org/​docs-html/​prog/​progsu40.html]] Source : [[https://​www.freepascal.org/​docs-html/​prog/​progsu40.html]]
 +===== {$IFDEF} {$ELSE} {$ENDIF} =====
 +Voir ->  [[https://​wiki.lazarus.freepascal.org/​Conditional_compilation]]
 +
 +==== Exemple d'​utilisation dans un Projet ====
 +Avec le code
 +<code delphi>
 + uses ...
 +  {$IFDEF DEBUG_WS}LazLogger,​{$ENDIF}
 +...
 +</​code>​
 +
 +On ajoute dans les Options du Projet la directive ''​-dDEBUG_WS''​ pour definir la directive ''​DEBUG_WS''​ dans tout le projet
 +{{:​prog:​lazarus:​compilateur:​directives:​option_projet.png?​direct|}}
 +
 +
  
 ===== {$M+} / {$TYPEINFO ON} ===== ===== {$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). ​+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: 
 +<code delphi>​ 
 +{$M+} 
 +  TPersistent = class(TObject,​IFPObserved) 
 +  private 
 +  ... 
 +  end; 
 +{$M-}            
 +</​code>​
  
 Toutes les classes descendantes d'une classe qui a été compilée dans l'​état {$M+} recevront également des informations RTTI.\\ Toutes les classes descendantes d'une classe qui a été compilée dans l'​état {$M+} recevront également des informations RTTI.\\
Ligne 45: Ligne 121:
 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. 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 ​(partie de la RTL) est généré dans l'​état {$M+}. ​+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. 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.
Ligne 51: Ligne 127:
  
 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. 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]]
 +
 +===== {$MODE} =====
 +The {$MODE} sets the compatibility mode of the compiler. This is equivalent to setting one of the command line options -So, -Sd, -Sp or -S2. it has the following arguments:
 +
 +  *  **Default**\\ Default mode. This reverts back to the mode that was set on the command line.
 +  *  **Delphi**\\ Delphi compatibility mode. All object-pascal extensions are enabled. This is the same as the command line option -Sd. Note that this also implies {$H ON} (i.e., in Delphi mode, ansistrings are the default).
 +  *  **DelphiUnicode**\\ Delphi compatibility mode. All object-pascal extensions are enabled, and additionally the String keyword refers to a unicode string.
 +  *  **ExtendedPascal**\\ Extended pascal mode. Only available in 3.2 and higher.
 +  *  **TP**\\ Turbo pascal compatibility mode. Object pascal extensions are disabled, except ansistrings,​ which remain valid. This is the same as the command line option -So.
 +  *  **FPC**\\ FPC mode. This is the default, if no command line switch is supplied.
 +  *  **OBJFPC**\\ Object pascal mode. This is the same as the -S2 command line option.
 +  *  **MACPAS**\\ MACPAS mode. In this mode, the compiler tries to be more compatible to commonly used pascal dialects on the Mac OS, such as Think Pascal, Metrowerks Pascal, MPW Pascal.
 +  *  **ISO**\\ Standard Pascal, ISO 7185 mode. In this mode, the compiler complies with the requirements of level 0 and level 1 of ISO/IEC 7185.
 +===== {$MODESWITCH} =====
 +Voir la page consacrée : [[prog:​lazarus:​compilateur:​directives:​modesswitch]]
 +====== Sources & Resources ======
 +  * [[https://​www.freepascal.org/​docs-html/​prog/​progch1.html]]