#define (linguaggio C)
Nel linguaggio C la direttiva #define è usata per definire le macro o dei valori di sistema durante la preprocessione del codice sorgente.
La sintassi
#define NOME [ valore ]
Per convenzione i nomi delle macro sono scritti con le lettere maiuscole.
La direttiva #define deve essere indicata alle prime righe del codice sorgente del programma C, prima della funzione main().
Un esempio pratico
In questo esempio la direttiva assegna alla costante VERSIONE il valore 3.
Nota. La direttiva #define è usata anche per creare formule macro durante la preprocessione del linguaggio C.
Come funziona la direttiva #define
Nelle prime fasi della compilazione del codice, il preprocessore legge e sostituisce le direttive con le relative costanti senza alcun controllo sintattico.
Esempio
Nel seguente programma la direttiva #define assegna il valore 3 alla costante VERSIONE.
#define VERSIONE 3
int main() {
int v=0;
v=VERSIONE;
return 0;
}
La preprocessione sostituisce la costante VERSIONE con il valore 3.
Per questo motivo le costanti macro sono usate nel codice sorgente della funzione main() senza essere definite, perché sono sostituite con i valori nella preprocessione.
int main() {
int v=0;
v=3;
return 0;
}
Successivamente, il codice sorgente viene compilato in quest'ultima forma.
Esempi pratici
Alcuni esempi pratici di utilizzo della direttiva #define.
Esempio 1
#include <stdio.h>
#define VERSIONE 3
int main() {
printf("La versione e\' %d, VERSIONE);
return 0;
}
La direttiva #define assegna alla costante VERSIONE il valore 3.
Nella funzione main() l'istruzione printf stampa sullo schermo il valore della costante VERSIONE.
L'output del programma è il seguente
3
Esempio 2
Il numero dei cicli dell'istruzione for è definito da una variabile macro.
#include <stdio.h>
#define ULTIMO 10
int main()
{int i = 0;
for(i = 0; i< ULTIMO;i++) {
printf(" %d ", i);
return 0;
}
Questo programma stampa i numeri da 0 a 9.
0 1 2 3 4 5 6 7 8 9
Esempio 3 ( macro )
Questo programma crea una macro con #define
#define SOMMA(x,y) x + b
{int i = 0;
int a=1;
int b=2;
int s=0;
s=SOMMA(a,b)
return 0;
}
In fase di preprocessione s=SOMMA(a,b) viene sostituito con s=3.
Esempio 4 (macro)
#define MOLTIPLICA(x,y) x * b
{int i = 0;
int a=1;
int b=2;
int s=0;
s=MOLTIPLICA(a+b,b)
return 0;
}
In questo caso la direttiva s=MOLTIPLICA(a+b,b) è sostituita con s=1+2*2.
Il preprocessore non esegue la somma (a+b) ma si limita a sostituire i valori nel codice.
Attenzione. Il risultato finale della direttiva non è (a+b)*b ma (a+b*b). Sono due espressioni matematiche diverse. Questo può indurre in errore.
Esempio 5 (macro)
#define MOLTIPLICA(x,y) (x) * (b)
{int i = 0;
int a=1;
int b=2;
int s=0;
s=MOLTIPLICA(a+b,b)
return 0;
}
In questo caso la direttiva s=MOLTIPLICA(a+b,b) è sostituita con s=(1+2)*2 perché nella macro sono indicate le parentesi.
In questo modo si risolve il problema dell'esempio precedente.
Esempio 6 ( macro con id condizionale )
In questo caso la direttiva macro utilizza una if condizionale in linea.
#define MAX(x,y) ( (x>y) ? x : y )
int main() {
int a=3;
int b=5;
int s="";
s=MAX(a,b);
return 0;
}
Nella preprocessione s=MAX(a,b) viene sostituita con s=5, perché a>b.