Sign in Join
Wiki copytemporary

Conditional compilation/fr: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11# Directive à la compilation \$DEFINE et \$IFDEF
22
33## Pourquoi ?
44
55Si vous avez une application qui demande plusieurs variantes, disons pour deux clients ou pour deux systèmes d'exploitation alors les directives de compilation sont faites pour vous. Un exemple pratique est quand vous codez pour plusieurs plates-formes. Les applications 32 bit permettent des fichiers de 4 Go parce c'est la taille maximale d'un Integer mais d'autres systèmes d'exploitation n'ont pas cette limitation. Ainsi une définition de FileSize peut être la suivante :
66
77``` pascal
88var
99 MyFilesize:
1010 {$ifdef Win32}
1111 Cardinal
1212 {$else}
1313 int64
1414 {$endif}
1515```
1616
1717Rien de ceci n'est sensible à la casse. {\$ifdef}, {\$else}, etc sont appelés symboles. Quand ils sont assemblés pour réaliser une logique, le code résultant est appelé une macro. Pour d'autres exemples pratiques, voir : [[Code Conversion Guide/fr|Code_Conversion_Guide/fr#Les_variables_utiles_pour_le_compilateur]].
1818
1919Une autre façon de faire la même chose est d'utiliser les macros de l'IDE [[IDE Macros in paths and filenames/fr]].
2020
2121Il ne reste plus qu'à savoir où est placé {\$DEFINE WIN32}, dans le code ou l'IDE.
2222
2323Il y a trois façons de faire cela.
2424
2525### Unité basée sur les instructions {\$DEFINE} et {\$IFDEF}
2626
2727``` pascal
2828 //Insérez le symbole $DEFINE à un point antérieur du code de l'unité
2929 {$DEFINE Win32}
3030 var
3131 MyFilesize:
3232 {$ifdef Win32}
3333 Cardinal
3434 {$else}
3535 int64
3636 {$endif}
3737 //Insert $UNDEF symbol
3838 {UNDEF $Win32}
3939
4040```
4141
4242### Utiliser l'EDI
4343
4444Dans l'EDI, aller dans la page Projet \| Options du projet \| Options du compilateur \| Options personnalisées et entrez -dWin32 ou Win32, selon la version. Dans Lazarus 1.2.4, le -d est entré automatiquement.
4545
4646Dans les options personnalisées
4747
48-`-d est identique à #DEFINE`\
49-`-u est identique à #UNDEF`
48+```text
49+-d est identique à #DEFINE
50+-u est identique à #UNDEF
51+```
5052
5153Ces entrées s'appliquent à la totalité du projet.
5254
5355### Utilisez un fichier d'inclusion
5456
5557Voir l'exemple plus détaillé plus bas.
5658
5759## Symboles
5860
5961Les \$IFNDEF, \$IFDEF, \$ENDIF, \$ELSE, \$DEFINE, \$UNDEF imbriqués sont permis. Voir [[local compiler directives/fr|Conditonnelle de compilation]] pour une liste complète.
6062
6163## Exemples complexes
6264
6365Les defines et les fichiers d'inclusion (.inc) basés unité doivent ajoutés dans chaque unité concernée. Alors qu'une option personnalisée s'applique à toutes les unités du projet.
6466
6567### Instructions {\$DEFINE} et {\$IFDEF} basés unité
6668
6769Créez un projet avec une simple fiche comme ci-dessous. Commentez et décommentez les deux instructions {\$DEFINE} tour à tour et regardez ce qui se passe. Si vous ajoutez une seconde fiche (Form2) qui s'ouvre quand la première (Form1) est cliquée, des instructions similaires fonctionneront indépendamment des instructions {\$DEFINE} de Form1.
6870
6971``` pascal
7072var
7173 Form1: TForm1;
7274
7375implementation
7476
7577{$R *.lfm}
7678{$DEFINE RED}
7779//{$DEFINE BLUE}
7880{ TForm1 }
7981
8082procedure TForm1.FormClick(Sender: TObject);
8183begin
8284 {$IFDEF RED} Form1.Color := clRed; {$ENDIF}
8385 {$IFDEF BLUE} Form1.Color := clBlue; {$ENDIF}
8486 {$IFDEF BLUE AND $IFDEF RED} Form1.Color := clYellow; {$ENDIF}
8587 {$IFNDEF RED AND $IFNDEF BLUE} Form1.Color := clAqua; {$ENDIF}
8688end;
8789```
8890
8991### Fichiers d'inclusion
9092
9193Les fichiers d'inclusion ajoute du code dans toute unité .pas.
9294
9395Créez un fichier appelé unit1.inc (il pourrait s'appeler n_importe_quoi.pas) qui contient :
9496
9597``` pascal
9698{$DEFINE RED}
9799//{$DEFINE BLUE}
98100```
99101
100102Créeez une autre appelée unit1a.inc qui contient :
101103
102104``` pascal
103105 {$IFDEF RED} Form1.Color := clRed; {$ENDIF}
104106 {$IFDEF BLUE} Form1.Color := clBlue; {$ENDIF}
105107 {$IFDEF BLUE AND $IFDEF RED} Form1.Color := clYellow; {$ENDIF}
106108 {$IFNDEF RED AND $IFNDEF BLUE} Form1.Color := clAqua; {$ENDIF}
107109```
108110
109111Ajoutez-les dans le dossier du projet. Une fois compilées, ces lignes remplaceront les instructions \$INCLUDE ci-dessous. Les deux méthodes présentent le même code au compilateur. Néanmoins, employer des fichiers d'inclusion permet de répondre à des exigences plus complexes.
110112
111113``` pascal
112114var
113115 Form1: TForm1;
114116
115117implementation
116118
117119{$R *.lfm}
118120 {$INCLUDE unit1.inc}
119121{ TForm1 }
120122
121123procedure TForm1.FormClick(Sender: TObject);
122124begin
123125 {$INCLUDE unit1a.inc}
124126end;
125127```
126128
127129Maintenant, nous pouvons l'étendre à ceci :
128130
129131``` pascal
130132var
131133 Form1: TForm1;
132134
133135implementation
134136
135137{$R *.lfm}
136138{$IFDEF ABC}
137139 {$INCLUDE abc.inc}
138140{$ELSE}
139141 {$INCLUDE xyz.inc}
140142{$ENDIF}
141143
142144{ TForm1 }
143145
144146procedure TForm1.FormClick(Sender: TObject);
145147begin
146148 ... some code ...
147149{$IFDEF ABC}
148150 {$INCLUDE abcCode.inc}
149151{$ELSE}
150152 {$INCLUDE xyzCode.inc}
151153{$ENDIF}
152154... some more code ...
153155end;
154156```
155157
156158### Projet \| Options du projet \| Options du compilateur \| Options personnalisées
157159
158160Mettre en commentaire ou effacer les symboles {\$DEFINE} dans votre code et ajouter les directives comme ci-dessous. Dans ce cas, les directives s'appliqueront à toutes les unités.
159161
160162Ceci définit les symboles FPC. Par exemple, -dDEBUG -dVerbose définiront les symboles FPC DEBUG et Verbose, ainsi vous pouvez utiliser {\$IFDEF Debug}. Voir [[IDE Macros in paths and filenames]].
161163
162164Remarquez le préfixe -d.
163165
164-`-dRED`\
165-`-dBLUE`
166+```text
167+-dRED
168+-dBLUE
169+```
166170
167171Une approche similaire peut être utilisée en compilant avec FPC au lieu de Lazarus : spécifiez l'argument -d... dans la ligne de commande en appelant FPC (p.ex. dans un fichier de commandes).
168172
169173Depuis Lazarus 1.2, la nouvelle IHM des options offre un choix : soit entrer la directive avec -d comme précédemment, soit utiliser l'interface graphique. L'interface graphique stocke toutes les directives entrées et active celles que vous avez sélectionnées. Celles-ci sont alors affichées comme dans la pré version 1.2 avec le préfixe -d.
170174
171175---
172176*From the Free Pascal wiki, page "Conditional compilation/fr", as it stood on 2020-02-11 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history