C_facile : Introduction au langage C
Cours

#define

Deux type d'utilisations sont possibles pour le #défine :

SyntaxePremiè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.

Fondamental

Deux type d'utilisations sont possibles pour le #défine :

Première utilisation : substitution de symboles

Syntaxe

#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.

Exemple

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.

Exemple

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

Définition

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, ...

Exemple

#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.

#include (page suivante)Introduction (page Précédente)
AccueilImprimer creativecommons : by-nc-ndRéalisé avec SCENARI