*
* 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.
*/
