Lezione 9 di C Il Preprocessore

      Nessun commento su Lezione 9 di C Il Preprocessore

Eccoci ad un’altra lezione sul linguaggio C! In questa lezione introdurremo il preprocessore e le sue direttive. Spiegheremo per bene cos’è, come si comporta e come possiamo sfruttarlo.

Il Preprocessore è un software che manipola i programmi C immediatamente prima della compilazione e l’affidarsi ad un preprocessore, rende il C (e anche C++) unico tra i maggiori linguaggi di programmazione.

Tuttavia, anche se è molto utile, spesso può causare molti bugs che sono difficili da scovare. Quindi usatelo ma con moderazione.

COME SI COMPORTA IL PREPROCESSORE?

Il comportamento del preprocessore é controllato dalle direttive di preprocessamento, ovvero dai comandi che sono preceduti dal simbolo: #.

INCLUSIONE DI FILE

Infondo lo abbiamo già usato fin ora proprio per includere le librerie standard e per le stringhe. Ricordate?

#include <stdio.h> ….. #include <string.h> …. #include <stdlib.h>

oppure per includere un file Header.h contenente i prototipi di una funzione:

#include “Header.h”

Però è possibile anche usare una direttiva #define che definisce una MACRO. Una macro non è altro che un nome che rappresenta qualcos’altro, come una costante o un’espressione che nel programma viene utilizzata frequentemente. Il preprocessore memorizza il nome della macro assieme alla sua definizione. Quando poi, in fase di compilazione del programma, il preprocessore incontra la macro, la sostituisce col valore che abbiamo impostato.

Inoltre definire delle macro ci permette di modificare velocemente un programma senza andare a cercare tutte le occorrenze, ad esempio di un numero. Ma non solo, i programmi saranno anche più facili e intuitivi da leggere. Le macro possono essere fondamentalmente di due tipi: MACRO SEMPLICI e MACRO PARAMETRICHE.

MACRO SEMPLICI

Una macro semplice ha la forma: #define identificatore – sostituzione

Dove sostituzione e’ una sequenza di token del preprocessore. Ovvero ci possono essere costanti carattere, costanti numeriche, stringhe letterali, operatori e carattere di interpunzione.

Definiamo assieme una macro semplice:

#define N 100

In questo modo abbiamo detto al preprocessore di andare a sostituire alla N il numero 100 tutte le volte che questa compare nel programma. Quindi se per esempio ho:

for (i=0; i<N; i++)

….

Il preprocessore andrà a sostituire alla N il numero 100. E se avessimo più for uguali, se dovessimo andare a modificare il programma in un secondo momento, ci basterà modificare la macro senza metterci a cercare tutte le occorrenze del numero 100.

Ma attenzione alla sintassi! Scritture di questo tipo sono assolutamente ERRATE:

#define N=100

oppure

#define N 100;

La scrittura corretta è riportata sopra!

Ma con le Macro semplici è possibile anche rinominare dei tipi. Ad esempio, se volessimo rinominare il tipo int, potremmo scrivere: #define BOOL int, e così avremmo creato un nuovo tipo anche: il tipo booleano, che non esiste nel C Ansi Standard.

MACRO PARAMETRICHE

Una macro parametrica ha la forma:

#define identificatore(x1,x2…xn) sostituzione

dove x1,x2…xn, sono proprio i parametri della macro. Ricordate bene che non devono essere presenti spazio fra il nome della macro e la parentesi tonda a sinistra, altrimenti il preprocessore penserà che si sta definendo una macro semplice e tratterà x1,x2…xn come parte della sostituzione.

Esempio:

#define MASSIMO(x,y) ((x)>(y)?(x):(Y))

invochiamo le macro, ad esempio, in questo modo:

j=MASSIMO(i+k, m-n);

Il preprocessore rimpiazzerà in questo modo:

j=((j+k)>(m-n)?(j+k):(m-n));

Dunque le macro parametriche possono fungere anche da semplici funzioni. Per esempio MASSIMO è una macro che si comporta come una funzione che calcola il massimo tra due numeri.

Anche per oggi è tutto, vi aspetto alla prossima lezione! E non dimenticate di fare molto esercizio su tutti gli argomenti che affrontiamo! La teoria è fondamentale, ma se non la applicate di volta in volta, non capirete granché!