Include guard: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Compilazione: Evidenziato punto da chiarire
Etichette: Modifica da mobile Modifica da web per mobile
Xr1blu (discussione | contributi)
Funzionalità collegamenti suggeriti: 1 collegamento inserito.
 
(7 versioni intermedie di 5 utenti non mostrate)
Riga 5:
Supponiamo di avere 3 file sorgenti senza #include guard:
 
=== <ttkbd>persona.h</ttkbd> ===
 
<sourcesyntaxhighlight lang="Cpp">
class persona
{
// dichiarazione
};
</syntaxhighlight>
</source>
 
=== <ttkbd>impiegato.h</ttkbd> ===
 
<sourcesyntaxhighlight lang="Cpp">
#include "persona.h"
 
Riga 23:
// dichiarazione
};
</syntaxhighlight>
</source>
 
=== <ttkbd>main.cpp</ttkbd> ===
 
<sourcesyntaxhighlight lang="Cpp">
#include "persona.h"
#include "impiegato.h"
Riga 36:
impiegato i;
}
</syntaxhighlight>
</source>
 
== Compilazione ==
In fase di compilazione, verraverrà creato un file oggetto: main.o Gli header files vengono inclusi nel file sorgente main.cpp ovvero il loro contenuto viene copiato dal [[preprocessore]] all'inizio del file main.cpp prima della compilazione.
 
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à una doppia dichiarazione di persona e rilascerà un errore di linkaggio. Infatti la classe persona sarà definita sia nel file <ttkbd>persona.o</ttkbd> che nel file <ttkbd>impiegato.o</ttkbd>. In quest'ultimo caso, quello del file <kbd>impiegato.o</kbd>, è necessario inserire la dichiarazione di persona. [Questoper periodovia nondella èdirettiva chiaro]#include specificata.
 
Per non avere questo tipo di problema basta utilizzare le #include guard in questa maniera:
 
=== <ttkbd>persona.h</ttkbd> ===
 
<sourcesyntaxhighlight lang="Cpp">
#ifndef PERSONA_H
#define PERSONA_H
Riga 54:
 
#endif // PERSONA_H
</syntaxhighlight>
</source>
 
Con questo ''trucchetto''accorgimento, la prima volta che viene incluso <ttkbd>persona.h</ttkbd>, il simbolo '''PERSONA_H''' non è ancora stato definito, e di conseguenza viene creato. Le successive volte che viene incluso <ttkbd>persona.h</ttkbd>, il simbolo '''PERSONA_H''' è 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 <ttkbd>.h</ttkbd> in modo da assicurare una maggiore trasparenza al programmatore evitando di incorrere in questo tipo di errore.
 
==#pragma once==
Riga 64:
La seguente è un'alternativa equivalente agli include guard ma più breve e più semplice e a volte incrementa la velocità di compilazione.
 
=== <ttkbd>persona.h</ttkbd> ===
 
<sourcesyntaxhighlight lang="Cpp">
#pragma once
 
//tutto il resto
</syntaxhighlight>
</source>
 
Indica che il file deve essere incluso una sola volta nella compilazione.