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

Contenu supprimé Contenu ajouté
Tavernierbot (discussion | contributions)
m Bot: Retouches cosmétiques
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 12 :
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 :
#define N 1143
Ligne 24 :
#undef PLATEFORME_INTEL
 
=== #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 42 :
* dans les fichiers d'en-tête de DLL sous Windows.
 
==== Exemples ====
===== Exemple 1 =====
 
#include <iostream>
Ligne 61 :
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 =====
// Définir la taille d'un tableau contenant le prix :
// - de 5 variétés d'orange
Ligne 78 :
#endif
 
===== Exemple 3 =====
'''Fichier toto.h'''<br/>
 
Ligne 95 :
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> :
#pragma once
Ligne 103 :
* 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 111 :
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 ====
#include <iostream>
using namespace std;
Ligne 123 :
}
 
==== 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 fin de ligne.