c:define
Un article de Polydoc.
La commande de préprocesseur #define est utilisée pour faire des substitutions dans le fichier actuel :
Ici, toutes les occurrences de "A" dans le fichier seront remplacées par "256", avant la compilation. Ce qui produira, si on appelle la fonction func(), "256".
Mais "#define" est aussi utilisée pour créer des "mini-fonctions", appelées macro, car le code des fonctions en question est remplacé, ce qui rend l'exécutable plus rapide, mais aussi plus gros et rend les vérifications moins précises. Cet exemple donne la taille d'un tableau (nombre de cases) :
#define tailleTab(t) sizeof t / sizeof *t //Équivalent à t[0] int tableau[2] = {5, 4}; printf("%ld", tailleTab(tableau));
Ce code affichera "2" (16 / 8).
Celui-ci donne la valeur absolue du nombre passé en paramètre :
#define absolue(x) x < 0 ? ~x + 1 : x //~x + 1 donne l'opposé d'un nombre printf("%ld %ld", absolue(-1), absolue(46));
Attention toutefois de bien penser de sécuriser sa macro qu'elle ne soit pas "contaminée" par le code environnant pour éviter les effets de bord. Ainsi, il est plus correct d'écrire :
#define tailleTab(t) ((sizeof t) / (sizeof *t)) #define absolue(x) (((x) < 0) ? ((~(x)) + 1) : (x))
Chaque nouvelle ligne de la macro doit commencer par "\" :
#define punition(message, fois) \ int i; \ for (i = 0; i < fois; i++) \ printf("%s\n", message); punition("Je ne dois pas lancer de papiers en classe", 50);
Ce code écrira 50 fois "Je ne dois pas lancer de papiers en classe".

