Include guard
Nei linguaggi C e C++, le #include guard sono delle particolari direttive (o macro) che vengono usate nei file header per evitare di avere spiacevoli errori in fase di linking. In alcuni casi è proprio impossibile farne a meno, specialmente se il progetto inizia ad avere molti file sorgenti.
Indice |
Esempio [modifica]
Vediamo ora un esempio di utilizzo delle #include guard. Supponiamo di avere 3 file sorgenti:
persona.h [modifica]
class persona { // dichiarazione };
impiegato.h [modifica]
#include<persona.h> class impiegato : public persona { // dichiarazione };
main.cpp [modifica]
#include<persona.h> #include<impiegato.h> int main() { persona p; impiegato i; }
Compilazione [modifica]
In fase di compilazione, verranno creati 3 file oggetto:
- persona.o che contiene la dichiarazione e definizione di una persona;
- impiegato.o che contiene la dichiarazione e definizione di un impiegato e la dichiarazione di una persona;
- main.o 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 rilascerà un errore di linkaggio. Infatti la classe persona sarà definita sia nel file persona.o che nel file impiegato.o. 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:
persona.h [modifica]
#ifndef PERSONA_H #define PERSONA_H // tutto il resto #endif // PERSONA_H
Con questo trucchetto, la prima volta che viene incluso persona.h, il simbolo PERSONA_H non è ancora stato definito, e di conseguenza viene creato. Le successive volte che viene incluso persona.h, 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 .h in modo da assicurare una maggiore trasparenza al programmatore evitando di incorrere in questo tipo di errore.
|
|