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

Contenu supprimé Contenu ajouté
Ligne 122 :
return 0;
}
 
====Bonnes pratiques====
Afin d'tiliser 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ées 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.
#define AFFICHER(x) \
cout << x; \
cout << endl;
 
L'utilisation la plus courante des macros est de ne pas mettre de <code>;</code> à la fin de celle-ci, mais de le mettre dans le code, là où elle est utilisée. En effet, on peut prévoit qu'une macro soit utilisable en tant qu'instruction simple, ou en tant que condition ou paramètre de fonction où l'on ne doit pas mettre de <code>;</code>. Pour les macros qui ne retournent rien (comme la macro AFFICHER dans l'exemple précédent), le placement du <code>;</code> n'est pas un problème car cette macro ne retourne rien et ne sera jamais utilisée dans une condition ou un appel de fonction.
#include <iostream>
using namespace std;
#define DIVISER(x, y) ((x) / (y))
int main()
{
int valeur = DIVISER(5, 3);
 
if (DIVISER(8, 2) == 4)
cout << DIVISER(1.0, 5.0) << endl;
 
return 0;
}
 
Il est fortement conseillé de toujours utiliser un paramètre de macro avec des parenthèses autour. Si l'on reprend l'exemple précédent sans parenthèse:
#include <iostream>
using namespace std;
#define DIVISER(x, y) x / y
int main()
{
int valeur = DIVISER(5, 3);
 
if (DIVISER(4 + 4, 2) == 4)
cout << DIVISER(1.0, 5.0) << endl;
 
return 0;
}
 
Ici, le résultat obtenu n'est pas forcement celui désiré. <code>DIVISER(4 + 4, 2)</code> sera traduit après la précompilation par <code>4 + 4 / 2</code>. Ceci donne pour valeur 4 + 2, soit 6. Ajouter un maximum de parenthèses permet de s'assurer de la validité de la macro sous plusieurs utilisations différentes. Ainsi, dans l'exemple précédent, une utilisation de parenthèses dans la macro (<code>#define DIVISER(x, y) ((x) / (y))</code>), aurait traduit <code>DIVISER(4 + 4, 2)</code> en <code>((4 + 4) / (2)</code>. Ceci aurit donné domme valeur 8 / 2 = 4, la valeur attendue.