18.08.2013 Views

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

....<br />

}<br />

}<br />

Non è possibile ottenere l’indirizzo di una variabile register, il compilatore <strong>per</strong>ciò segnalerà un<br />

errore nell’esempio seguente:<br />

register int i;<br />

scanf("%d", &i);<br />

NOTA La direttiva register è da considerare obsoleta, in quanto il compilatore<br />

è in grado di determinare automaticamente se una variabile è bene che sia<br />

memorizzata in un registro o meno.<br />

10.6 Variabili static<br />

La parola chiave static è un qualificatore <strong>per</strong> codice e dati, che serve <strong>per</strong> cambiare le regole di<br />

visibilità.<br />

Un simbolo globale, sia esso una funzione o una variabile, se dichiarato static non è visibile<br />

all’esterno del file ove è definito, <strong>per</strong>ché il suo nome non viene reso disponibile al linker. Una<br />

variabile locale, se static, viene allocata nello spazio dati globale, ma senza esportarne il nome;<br />

<strong>per</strong>mette quindi di avere uno stato <strong>per</strong>sistente tra le varie invocazioni del blocco in cui è definita.<br />

Per esempio:<br />

int i; /* globale */<br />

static int j; /* globale, ma visibile solo in questo file */<br />

static int invert(int i) /* invert può essere chiamata solo in questo file */<br />

{<br />

int j; /* allocata sullo stack */<br />

j = -i; /* variabili locali, "i" è l’argomento della funzione */<br />

return j;<br />

}<br />

int count(void) /* count è definita globalmente nel programma */<br />

{<br />

static int i; /* locale ma <strong>per</strong>sistente, inizializzata a zero */<br />

return ++i; /* incrementa il contatore e ritorna il valore */<br />

}<br />

Il programma precedente dimostra una serie di dichiarazioni di variabili statiche/dinamiche,<br />

locali/globali. L’esempio è abbondantemente commentato.<br />

Appartengono quindi <strong>alla</strong> classe static questa classe variabili locali ad un blocco, allocate<br />

<strong>per</strong>ò staticamente. A differenza delle variabili auto, il valore delle variabili static si conserva da<br />

una chiamata all’altra della stessa funzione. In altri termini il lifetime di una variabile static è<br />

<strong>per</strong>manente. Una variabile static mantiene quindi il suo valore, pur rimanendo invisibile al di<br />

fuori del blocco di definizione.<br />

func()<br />

{<br />

106

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!