« Programmation C++/Le préprocesseur » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 1 :
{{Programmation C++}}
 
== Le préprocesseur ==
Avant de compiler le programme, il est possible d'effectuer certaines modifications sur le code source. Le programme effectuant ces modifications s'appelle le préprocesseur.
Les commandes destinées au préprocesseur commencent toutes par # en début de ligne.
 
=== Inclusion de fichiers ===
Pour inclure un fichier à un certain endroit dans le fichier source, on écrit :
#include "''nom_du_fichier''"
Ligne 14 ⟶ 15 :
Le fichier C++ standard iostream est inclus à cet endroit-là dans le code. Il contient la définition de certains objets standards notamment cin et cout.
 
=== #define, #undef ===
La directive <code>#define</code> permet de remplacer toutes les occurrences d'un certain mot par un autre. Par exemple :
<source lang="cpp">
Ligne 32 ⟶ 33 :
</source>
 
=== #ifdef, #ifndef, #if, #endif et #else ===
==== Présentation ====
Toutes ces directives permettent la compilation conditionnelle.
C'est à dire que la partie du code comprise entre la directive conditionnelle (<code>#ifdef</code>, <code>#ifndef</code> ou <code>#if</code>) et la fin du bloc signalée par la directive <code>#endif</code> n'est compilée que si la condition est remplie.
Ligne 55 ⟶ 56 :
* dans les fichiers d'en-tête de DLL sous Windows.
 
==== Exemples ====
===== Exemple 1 =====
 
<source lang="cpp">
Ligne 76 ⟶ 77 :
Dans ce programme, il suffit d'effacer <code>#define FRENCH</code> et de recompiler le programme pour passer d'une version française à une version anglaise. Ceci pourrait être utile si le programme comporte 10 000 lignes (ce qui est faible pour un programme réel). Bien évidemment, il existe bien d'autres façons de gérer le multilinguisme en C++.
 
===== Exemple 2 =====
 
<source lang="cpp">
Ligne 96 ⟶ 97 :
</source>
 
===== Exemple 3 =====
'''Fichier toto.h'''<br/>
 
Ligne 115 ⟶ 116 :
La première fois que le header sera inclus, ''TOTO_H'' n'est pas défini, le header normal sera donc inclus. ''#define TOTO_H'' définira alors la variable de compilation ''TOTO_H''. La deuxième fois que ce même header sera inclus, et les fois suivantes, ''TOTO_H'' sera défini et par conséquent, le header sera vide. les prototypes n'auront donc été inclus qu'une seule fois. Le tour est joué. Il faut donc faire commencer systèmatiquement (c'est tout du moins conseillé) tous les fichiers header par les 2 lignes ''#ifndef ...'' et ''#define ...'' et les faire se terminer par ''#endif''.
 
===== Autre solution =====
Toutefois, il existe une autre solution au problème précédent en utilisant la directive suivante en début de fichier <code>.h</code> :
<source lang="cpp">
Ligne 125 ⟶ 126 :
* GCC for Darwin
 
=== Les macros ===
==== Présentation ====
Les macros sont des <code>#define</code> particulier parce qu'ils contiennent des paramètres. Ainsi si vous écrivez :
 
Ligne 135 ⟶ 136 :
Alors vous pouvez écrire <code>AFFICHE("BONJOUR")</code> et le préprocesseur modifiera cette ligne et la transformera en <code>cout &lt;&lt; "BONJOUR" &lt;&lt; endl;</code>. Il y aura substitution de <code>x</code> par <code>"BONJOUR"</code>. Il ne faut pas abuser des macros et très souvent l'utilisation de fonctions, notamment les fonctions inline, est préférable.
 
==== Exemple ====
 
<source lang="cpp">
Ligne 150 ⟶ 151 :
</source>
 
==== Bonnes pratiques ====
Afin d'utiliser correctement les macros, il est préférable de les afficher clairement et de les rendre suffisamment flexible à différentes utilisations.
Si la macros est constituée de plusieurs instructions séparés par des <code>;</code>, il est préférable d'écrire la macro sur plusieurs lignes afin d'accroître sa lisibilité. Pour indiquer à une macro que sa définition continue sur la ligne suivante, il suffit d'indiquer un antislash ('\') en dernier caractère le la ligne.