La première règle est : ne les utilisez pas si vous n’avez pas à le
faire\footnote{On lira avec intérêt le fichier /usr/include/ctype.h}.
Il a pu être observé qu’à peu près chaque macro démontre un défaut
dans la programmation. Puisqu’elles réorganisent le texte d’un programme avant
que le compilateur ne les voit, les macros sont un problème majeur pour la
plupart des outils de développement (débogueurs, profileurs\ldots).
Rappel
Une directive (macro-instruction\footnote{Mammeri M.
{\it programmation} {\sc école centrale de paris} {\tiny 1997-1998} p. 112})
de prétraitement de la forme :
#defineidentificateur chaine-symbole
provoque le remplacement par le préprocesseur de toutes les instances
suivantes de l’identificateur avec la séquence de symboles donnée. Les espaces
entourant la séquence de symboles de remplacement sont annulés. Par exemple :
#define COTE 8 char jeu[COTE][COTE] ;
devient après le passage du précompilateur :
char jeu [8] [8] ;
Opérateur #
Si une occurrence d’un paramètre dans une séquence de symboles de remplacement
est immédiatement précédée par un symbole #, le paramètre et
l’opérateur # seront remplacés dans le développement par un littéral
chaîne contenant l’orthographe de l’argument correspondant. Un caractère
\ est inséré dans un littéral chaîne avant chaque occurrence d’un
\ ou d’un " à l’intérieur d’une (ou délimitant) une
constante caractère ou un littéral chaîne dans l’argument.
à l’appel
char * outil = path(jjd, listlp) ;
sera interprété :
char * outil = "/users/" "jjd" "/bin/" "listlp" ;
qui sera ensuite concaténé pour devenir :
char * outil = "/users/jjd/bin/listlp" ;
Opérateur ##
Si un opérateur ## apparaît entre deux symboles dans une séquence de
symboles de remplacement, et si l’un ou l’autre des symboles est un paramètre,
il est tout d’abord remplacé, puis l’opérateur ## et tous les espaces
l’entourant sont ensuite supprimés. L’effet de l’opérateur ## est donc
une concaténation.
Par exemple dans la création du TDA liste (Liste.h et Liste.tda)