* * Ora parleremo di un modo per sostituire numeri con nomi, tramite le * funzionalita' del #define, un comando del preprocessore. * Il C in un primo passaggio di compilazione svolge le attivita' del * preprocessore, che si occupa di eseguire le direttive #include e #define. * Abbiamo gia' visto che #include serve per includere nel listato dei * file header, che non sono altro che altri pezzi di listato con delle * cose a noi utili, con delle costanti, strutture o funzioni gia' definite. * Possiamo definire anche dei nostri file header e includerli. * Il comando #define invece serve per operare delle sostituzioni di parole * con altre, prima della compilazione vera e propria. Ad esempio: * * #define PI_GRECO 3.1415 * * Permette di scrivere PI_GRECO nel listato al posto di 3.1415, e badate * bene che non definiamo una variabile! Semplicemente c'e' uno scambio di * testi, in modo analogo alle funzioni "replace" dei text editor. * Operazioni di sostituzione di questo tipo possono essere utili per rendere * piu' leggibile un listato, sostituendo i numeri con parole che si * riferiscono al significato di tale numero. * Da notare che la prassi vuole che gli identificatori, ossia le stringhe * sostituite col define, siano a caratteri MAIUSCOLI, a differenza delle * variabili, e cio' contribuisce a distinguere variabili da identificatori. * Inoltre, se dovessimo mettere lo stesso numero in un sacco di punti * del listato, e poi un giorno dovessimo modificare quel valore, dovremmo * ricercarlo e cambiarlo in tutti i punti del listato, mentre se lo * definiamo con #define, bastera' cambiare il #define e cambieremo * automaticamente quel valore in tutto il listato. * La sintassi e' questa: si mette il #define, poi il testo che vogliamo * usare nel listato, infine il testo con cui sara' scambiato al momento * del preprocessing. Questi due testi devono essere separati da uno spazio. * Vediamo alcuni esempi: * * #define NUM_PAGINE 400 * #define NOME_AUTORE Dante * #define TITOLO Divina_Commedia * * A questo punto, quando scriviamo nel listato: * * NUM_PAGINE * NOME_AUTORE * TITOLO * * Il preprocessore sostituira' i testi prima di iniziare, ottendendo: * * 400 * Dante * Divina_Commedia * * Con il #define si possono definire anche MACRO piu' complicate, ma * vedremo al momento opportuno. * Da notare che le sostituzioni non avvengono nelle stringhe di testo * racchiuse tra "". * Gia' che ci siamo, facciamo una precisazione sulla dichiarazione delle * variabili. Abbiamo gia' detto che vanno dichiarate prima di essere * usate. Ad esempio: * * int pluto; * * Comunque, e' possibile inizializzarla nella dichiarazione stessa, * dandogli un valore: * * int pluto = 1000; * * In questo modo la variabile e' dichiarata ed ha gia' il valore di 1000. * Cio' e' equivalente a questo: * * int pluto; * pluto = 1000; * * Poi la variabile puo' essere cambiata in qualsiasi momento, normalmente. * A questo punto dovrebbe essere chiara la differenza: * * #define GIORNI 365 * int pluto = 1000; * * Il #define permette solamente di scrivere GIORNI al posto di 365, mentre * l' "int pluto=1000;" e' una dichiarazione di variabile, la quale potra' * essere usata nel programma e potra' assumere qualsiasi valore. * Vediamo un listato di esempio, ricavato dal precedente: */ #include <stdio.h> /* Includiamo la libreria standard */ #define VALORE1 500 /* Quando scrivo VALORE1 nel listato ottengo 500, * dato che sara' scambiato col testo "500". */ #define VAL_TO 21.06 /* definisco VAL_TO = 21.06 */ #define PI_GRECO 3.1415 /* definisco PI_GRECO = 3.1415 */ int pluto = 1000; /* Dichiaro una variabile intera dandogli subito * il valore 1000 */ int pippo; /* Dichiaro una variabile di tipo int */ float topo, papero; /* Dichiaro 2 variabili di tipo float */ main() /* Funzione principale, eseguita per prima */ { /* Inizio della funzione main() */ pippo = pluto + VALORE1; /* Assegno a pippo il val. di pluto + 500 */ topo = VAL_TO; /* Assegno a topo il valore 21,06 */ papero = PI_GRECO; /* Assegno a papero il valore 3.1415 */ /* Stampo il valore di 2 variabili di tipo INT con un solo printf() */ printf("Pluto = %d , Pippo = %d\n", pluto, pippo); /* Stampo il valore di 2 variabili di tipo FLOAT con un solo printf() */ printf("Topo = %f , Papero = %f\n", topo, papero); /* Stampo il valore di tutte le 4 variabili con un solo printf() */ printf("Pluto=%d ,Pippo=%d ,Topo=%f ,Papero=%f\n",pluto,pippo,topo,papero); } /* Fine della funzione main() */ /* Questo listato fa esattamente le stesse cose del precedente, solo che * e' stato introdotto il #define e si e' inizializzata una variabile * dandogli subito un valore. * Da notare che in Java il #define e' assente. */