Include guard: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Errore riguardo alla generazione dei file oggetto. Gli header file non vengono compilati in file oggetto differenti ma semplicemente inclusi in main.cpp prima della compilazione.
Xr1blu (discussione | contributi)
Funzionalità collegamenti suggeriti: 1 collegamento inserito.
 
(8 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 per via della direttiva #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.