next up previous contents Next: Débogage avec gdb et Up: Les bases du C. Previous:  Les commentaires.   Table des matières  


23.1.12  #define et #id - les macros en C.

Toute ligne qui commence par un # n'est pas vraiment du C, mais bel et bien une directive de préprocesseur. Un programme en C est, avant toute chose, traité par un préprocesseur qui élimine tout ce qui n'est pas les instructions proprement dites, comme par exemple les commentaires, les déclarations # include, et en général, les lignes débutant par #. Vous pouvez rendre vos programmes en C plus lisibles en définissant des macros au lieu des valeurs littérales. Par exemple, dans notre programme,

#define START_OF_BUFFER_SIZE 256 
 


ce code définit (#defines) le texte START_OF_BUFFER_SIZE comme équivalent au texte 256. Par la suite, partout dans le code C où nous avons à faire à START_OF_BUFFER_SIZE, le compilateur y verra le texte 256. L'usage de l'expression START_OF_BUFFER_SIZE rend le code plus clair car, en cas de modifications, un seul changement à la ligne #define START_OF_BUFFER_SIZE 256 doit être fait. START_OF_BUFFER_SIZE est également plus facile à lire, à interpréter pour le programmeur.

Chaque fois que vous avez une constante littérale comme 256, vous devriez la remplacer par une macro définie au début du programme.

Vous pouvez aussi vérifier l'existence de macros avec les directives #ifdef et #ifndef. En soi, les directives # constituent un langage de programmation:

/* Set START_BUFFER_SIZE to fine-tune performance before compiling: */ 
#define START_BUFFER_SIZE 256 
/* #define START_BUFFER_SIZE 128 */ 
/* #define START_BUFFER_SIZE 1024 */ 
/* #define START_BUFFER_SIZE 16384 */ 
 
#ifndef START_BUFFER_SIZE 
#error This code did not define START_BUFFER_SIZE. Please edit 
#endif 
#if START_BUFFER_SIZE <= 0 
#error Wooow START_BUFFER_SIZE must be greater than zero 
#endif 
 
#if START_BUFFER_SIZE < 16 
#warning START_BUFFER_SIZE too small, progamme may be inefficient 
#elif START_BUFFER_SIZE > 65536 
#warning START_BUFFER_SIZE too large, programme may be inefficient 
#else 
/* START_BUFFER_SIZE is OK, do not report */ 
#endif 
 
void word_dump (char *filename) 
{ 
   < ... > 
   amount_allocated = START_BUFFER_SIZE; 
   q = malloc (amount_allocated); 
   < ... > 


next up previous contents Next: Débogage avec gdb et Up: Les bases du C. Previous:  Les commentaires.   Table des matières  
1-01-2006