Langage C: Directives du pré-compilateur

Un article de WikiTuto.

Jump to: navigation, search

Explications

Attention, les directives se terminent par le retour à la ligne et pas un ";".

#include <nomfic> 

permet d'insérer à cet endroit un fichier, qui serra cherché dans le répertoire correspondant à la bibliothèque du C (sur PC dans \TC\INCLUDE)

#include "nomfic" 

permet d'insérer à cet endroit un fichier, comme s'il était écrit ici, en le cherchant dans le répertoire actuel (le votre)

#define nom valeur 

remplace chaque occurrence du nom par la valeur. On ne peut prendre en compte qu'une ligne (le retour à la ligne terminant la définition). En C on a l'habitude de noter les constantes numériques en majuscules.

exemple

#define PI 3.1415926
#define begin {
#define end }
#define macro(parametres) définition : 

permet la définition d'une macro, les paramètres seront substitués lors de la réécriture. Il ne faut pas de blanc entre le nom de la macro et la "(" pour différencier d'un define simple.

#define double(a) a*2

remplacera double (i+5) par i+5*2. Il faut donc utiliser des parenthèses, même si elles semblent inutiles :

#define double(a) (a)*2

autre exemple:

#define max(x,y) x>y?x:y

replacera max(a,max(b,c)) par a>b>c?b:c?a:b>c?b:c

#define max(x,y) (((x)>(y)?(x):(y)

replacera max(a,max(b,c)) par (((a)>( (((b)>(c))?(b):(c)) )) ? (a) : (((( b)>(c)) ? (b) : (c))) ce qui donne des parenthèses superflues mais le résultat escompté.

Une macro ressemble à une fonction, mais sera d'exécution plus rapide : le texte est directement inséré à l'endroit voulu, mais pas de gestion de pile.

#undef nom : annule le précédent #define nom ...
#if (expression) : les lignes qui suivent ne seront lues (et compilées que si l'expression est vraie
#endif : fin de portée du #if précédent
#else : possible mais optionnel, faire attention en cas de #if imbriqués
#ifdef nom : comme #if mais vrai s'il y a eu auparavant un #define nom
#ifndef nom : vrai si variable non définie

exemples:

#ifndef entier
 #define entier int
 /* si une autre bibliothèque incluse plus haut l'a
 déjà défini, on ne le redéfinit plus */
#endif
#ifdef biblio_graphique
 initialise_ecran();
 efface_ecran();
 trace(dessin);
#else
 puts("si on avait eu un écran graphique j'aurai fait un dessin");
#endif
/* biblio_graphique peut être défini dans un "header" 
  (fichier.h) inclus ou non plus haut */


Voir aussi


Auteur :Patrick TRAU. Copyright : utilisation de ces documents libre pour tout usage personnel. Utilisation autorisée pour tout usage public non commercial, à condition de citer son auteur (Patrick TRAU, IPST, Université Louis Pasteur Strasbourg, email : Patrick.Trau (à) ipst-ulp.u-strasbg.fr ) et de me signaler tout usage intensif. Utilisation commerciale interdite sans accord écrit de ma part.

Boîte à outils
Annuaire gratuitCe site est listé dans la catégorie Informatique : Aide et astuces en informatique Annuaire