31.05.2013 Views

Tricky C - Si® @lbert Site

Tricky C - Si® @lbert Site

Tricky C - Si® @lbert Site

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

40 - <strong>Tricky</strong> C<br />

}<br />

}<br />

printf("%d\n",x);<br />

produce il seguente output:<br />

123<br />

321<br />

123<br />

Infatti la x locale dichiarata nel blocco di codice interno a main() nasconde la x globale,<br />

dichiarata fuori dalla funzione; tuttavia la variabile locale cessa di esistere alla fine del blocco, pertanto<br />

quella globale è nuovamente accessibile.<br />

Anche le variabili external, come quelle static, sono inizializzate dal compilatore al<br />

momento della compilazione, ed è loro attribuito valore 0 se il programmatore non indica un valore<br />

iniziale contestualmente alla dichiarazione.<br />

Come abbiamo visto, le variabili external devono essere dichiarate al di fuori delle funzioni,<br />

senza necessità di specificare alcuna particolare parola chiave. Tuttavia, esse possono (ma non è<br />

obbligatorio) essere dichiarate anche all'interno delle funzioni che le referenziano, questa volta<br />

necessariamente precedute dalla parola chiave extern:<br />

#include <br />

int x = 123;<br />

void main(void)<br />

{<br />

extern int x; // riga facoltativa; se c'e' non puo' reinizializzare x<br />

}<br />

printf("%d\n",x);<br />

In effetti il compilatore non richiede che le variabili external vengano dichiarate all'interno delle<br />

funzioni, ma in questo caso è necessario che tali variabili siano state dichiarate al di fuori della funzione e<br />

in linee di codice precedenti quelle della funzione stessa, come negli esempi precedenti. Se tali condizioni<br />

non sono rispettate il compilatore segnala un errore di simbolo non definito:<br />

#include <br />

int x = 123;<br />

void main(void)<br />

{<br />

printf("%d\n",x,y); // errore! y non e' stata ancora dichiarata<br />

}<br />

int y = 321;<br />

Il codice dell'esempio è compilato correttamente se si dichiara extern la y in main():<br />

#include <br />

int x = 123;<br />

void main(void)<br />

{<br />

extern int x; // facoltativa<br />

extern int y; // obbligatoria!

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

Saved successfully!

Ooh no, something went wrong!