Include guard: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
mNessun oggetto della modifica
m wikizzato
Riga 3:
Vediamo ora un esempio di utilizzo delle #include guard. Supponiamo di avere 3 file sorgenti:
 
File '''<tt>persona.h'''</tt>
 
<source lang="Cpp">
Riga 12:
</source>
 
File '''<tt>impiegato.h'''</tt>
 
<source lang="Cpp">
Riga 23:
</source>
 
File '''<tt>main.cpp'''</tt>
 
<source lang="Cpp">
Riga 37:
 
In fase di compilazione, verranno creati 3 file oggetto:
# <tt>persona.o</tt> che contiene la dichiarazione e definizione di una persona;
# <tt>impiegato.o</tt> che contiene la dichiarazione e definizione di un impiegato e ''la dichiarazione di una persona'';
# <tt>main.o</tt> che contiene tutto ciò che serve al main.
 
Senza interessarci delle implementazioni di persona e impiegato, il nostro obiettivo sarà quello di usare indistintamente una persona o un impiegato (ed i relativi metodi). Quando il linker andrà a creare l'eseguibile definitivo, avrà però una doppia dichiarazione di persona e rilascieràrilascerà un errore di linkaggio. Infatti la classe persona sarà definita sia nel file <tt>persona.o</tt> che nel file <tt>impiegato.o</tt>. In quest'ultimo caso è necessario inserire la dichiarazione di persona.
 
Per non avere questo tipo di problema basta utilizzare le #include guard in questa maniera:
 
File '''<tt>persona.h'''</tt>
 
<source lang="Cpp">
Riga 56:
</source>
 
Con questo ''trucchetto'', la prima volta che viene incluso <tt>persona.h</tt>, il simbolo '''H_PERSONA''' non è ancora stato definito, e di conseguenza viene creato. Le successive volte che viene incluso <tt>persona.h</tt>, il simbolo '''H_PERSONA''' è definito, perciò la parte relativa alla definizione della classe persona non viene tenuta in considerazione.
 
Di buona norma le #include guard devono essere inserite in tutti i file <tt>.h</tt> in modo da assicurare una maggiore trasparenza al programmatore evitando di incorrere in questo tipo di errore.
 
[[Categoria:Teorie della programmazione]]