La clause #define
sert aussi à définir des macros. Il sagit dabréviations ou de noms symboliques pour dautres 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 dune macro ; sil 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 quil ny ait plus de noms de macros, de sorte quune 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, à laide du symbole ##
. Ainsi, si lon é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 | Sommaire | Suivant |