#define
Deux type d'utilisations sont possibles pour le #défine :
#define chaîne_1 chaîne_2
-
La chaîne_1 est remplacée par la chaîne_2 à chaque fois qu'elle est rencontrée dans le code source (avant sa compilation).
-
La chaîne_2 commence au premier caractère non blanc après chaîne_1, et se termine sur le premier caractère non blanc rencontré à droite.
-
Généralement et pour plus de clarté la la chaîne_1 est écrite en majuscules mais ce n'est pas obligatoire.
Deux type d'utilisations sont possibles pour le #défine :
Première utilisation : substitution de symboles
#define chaîne_1 chaîne_2
-
La chaîne_1 est remplacée par la chaîne_2 à chaque fois qu'elle est rencontrée dans le code source (avant sa compilation).
-
La chaîne_2 commence au premier caractère non blanc après chaîne_1, et se termine sur le premier caractère non blanc rencontré à droite.
-
Généralement et pour plus de clarté la la chaîne_1 est écrite en majuscules mais ce n'est pas obligatoire.
Le #define était la seule façon de définir des constantes dans les versions initiales des compilateurs C. Ainsi, par exemple avec les déclarations suivantes :
#define NMAX 100
#define PI 3.1415926
à chaque fois que la chaîne NMAX sera rencontrée, lors de la pré-compilation, elle sera remplacée par la chaîne 100. De même, la chaîne PI sera remplacée par 3.14159265.
La substitution de symboles permet aussi de modifier l'aspect d'un programme source. Ce qui peut aider le programmeur à clarifier son code. Les substitutions suivantes :
#define begin {
#define end }
Sur le programme :
void main ()
begin
printf ("\nBonjour");
end
vont donner :
void main ()
{
printf ("\nBonjour");
}
Deuxième utilisation : Macro_instruction
Une définition de macro_instruction permet une substitution de texte paramétrée par des arguments.
#define chaîne1(a1,a2,....) chaîne2
-
Il n'y a pas d'espace entre la chaîne1 et la '('
-
Lors de la pré-compilation, dans le texte du programme, le symbole (x,y,...) est remplacé par la chaîne2 dans laquelle toutes les occurrences des arguments formels a1, a2, sont remplacées par les arguments effectifs x, y, ...
#define carre(Y) (Y)*(Y)
#define mauvais_carre(Y) Y*Y
si l'on écrit dans le code source :
carre(3) on obtiendra (3) * (3) après substitution
carre(k) on obtiendra (k) * (k) après substitution
carre(k+1) on obtiendra (k+1) * (k+1) après substitution
après la précompilation.
Par contre si l'on écrit dans le code source :
mauvais_carre(3) on obtiendra 3 * 3 après substitution
mauvais_carre(k) on obtiendra k * k après substitution
mauvais_carre(k+1) on obtiendra k+1 * k+1 après substitution
après la précompilation.
L'expression k+1 * k+1 vaut en fait 2 * k+1, ce qui ne correspond pas à ce qui est souhaité. Si l'on omet les parenthèses, des erreurs difficiles à détecter peuvent être générées.