Le direttive di definizione in C sono sostanzialmente due, #define e #undef, che, come vedremo sotto, possono essere usate congiuntamente per definire o meno qualcosa in modo condizionale.
Ma passiamo a spiegare l'utilizzo di #define; questa direttiva, quando serve per definire una costante ha la seguente sintassi,
#define identificatore espressione
in cui sostanzialmente il pre-processore sostituisce tutte le occorrenze di "identificatore" con l'espressione corrispondente (che può contenere anche spazi o virgolette); generalmente il nome di una costante definita con tale direttiva, oltre ad essere tutto maiuscolo, viene preceduto dal carattere underscore ( _ ). Quando la direttiva serve per definire una macro ha una sintassi leggermente diversa,
#define identificatore(argomenti) espressione
in questo caso, invece, si suppone che l'espressione contenga gli argomenti come variabili sulle quali operare, il pre-processore non fa altro che sostituire il codice di espressione, modificando gli argomenti definiti nella macro con quelli attuali, ad ogni occorrenza dell'identificatore.
Il vantaggio che si ha ad usare le direttive di definizione è quello di non appesantire il codice con chiamate o allocazioni di memoria, poiché si sostituisce il codice della macro con le occorrenze dell'identificatore nel codice sorgente e solo dopo lo si passa la compilatore. Qualcuno potrebbe controbattere che al posto delle sopraccitate direttive si potrebbero usare le parole chiave del C, const per le costanti e inline per le macro (che poi sono delle piccole funzioni); è vero, si può fare, anzi è opportuno non eccedere troppo con l'uso delle direttive che, invece, devono essere usate in forma alquanto limitata e solamente in quei casi in cui la sostituzione apporti un beneficio reale al programma ed alla leggibilità del sorgente. Ovviamente #undef serve solo per annullare il compito di ciò che abbiamo definito con l'eventuale #define.
Per fare un esempio presentiamo un pezzo di codice che fa uso delle direttive di definizione:
#include <stdio.h>
#define NUMERO 5
#define QUADRATO(a) (a)*(a)
int main()
{
int x;
printf("Numero : %d n", NUMERO);
x = QUADRATO(NUMERO);
printf("Quadrato: %d n", x);
#undef NUMERO
#define NUMERO 7
printf("Numero : %d n", NUMERO);
x = QUADRATO(NUMERO);
printf("Quadrato: %d n", x);
return 0;
}
Questo semplice programma stamperà a video,
Numero : 5
Quadrato : 25
Numero : 7
Quadrato : 49