Macros

La clause #define sert aussi à définir des macros. Il s’agit d’abréviations ou de noms symboliques pour d’autres objets, et elles ont traditionnellement un nom en majuscules. Voici quelques exemples classiques de macros en C :

#define PI 3.141592#define ERRMSG "Une erreur s'est produite.\n"#define CARRE(x) (x)*(x)

Le préprocesseur examine chaque ligne de code à la recherche du nom d’une macro ; s’il la trouve, il remplace le nom de la macro par sa valeur. Si la macro a un ou plusieurs paramètres, comme CARRE ci-dessus, ils sont remplacés littéralement par leur valeur effective. Ce processus se poursuit dans une ligne jusqu’à ce qu’il n’y ait plus de noms de macros, de sorte qu’une macro peut en contenir une autre, etc. (mais sans faire de cycle !). Par exemple, l’écriture suivante :

if ( CARRE(d) > PI)     printf(ERRMSG);

sera transformée ainsi par le préprocesseur :

if ( (d)*(d) > 3.141592)     printf("Une erreur s'est produite.\n");

Noter que dans le cas de CARRE, les occurrences de x dans la valeur de la macro ont été remplacées littéralement par d. Les occurrences qui se trouveraient dans des chaînes de caractères ne seraient toutefois pas remplacées.

On peut « coller » deux paramètres, ou un paramètre et un identificateur, à l’aide du symbole ##. Ainsi, si l’on écrit :

#define VAR(x) variable_##x

les occurrences de VAR(1) par exemple seront remplacées par variable_1.

Enfin, en plaçant un # devant un paramètre, on demande son remplacement par la chaîne de caractères de son nom :

#define AFFICHE(x) printf("Valeur de " #x " = %d\n" \                    , (x) )

Noter le caractère de continuation \ + saut de ligne pour faire une directive plus longue, comme indiqué précédemment. Les occurrences de AFFICHE(index) seront remplacées par :

printf("Valeur de " "index" " = %d\n" ,  (index) )

qui équivaut à :

printf("Valeur de index = %d\n" , (index)  )
Précédent Précédent Sommaire Sommaire Suivant Suivant