Include paza
Această intrare sau secțiune despre limbaje de programare nu menționează sursele necesare sau cei prezenți sunt insuficienți . |
În C și limbi C ++ , # includ gărzi sunt directive speciale (sau macro - uri ) , care sunt utilizate în fișiere antet pentru a evita problemele duble definiție în timpul conectării.
Exemplu
Să presupunem că avem 3 fișiere sursă fără #include guard:
persoana.h
persoană de clasă
{
// declarație
};
angajat.h
#include "persona.h"
angajat de clasă : persoană publică
{
// declarație
};
main.cpp
#include "persona.h"
#includeți „ angajat.h ”
int main ()
{
persoana p ;
angajat i ;
}
Compilare
La compilare, va fi creat un fișier obiect: main.o Fișierele antet sunt incluse în fișierul sursă main.cpp, adică conținutul lor este copiat din preprocesor la începutul fișierului main.cpp înainte de compilare.
Indiferent de implementările persoanei și angajaților, obiectivul nostru va fi să folosim indiferent fie persoana, fie angajatul (și metodele acestora). Când linkerul creează executabilul final, acesta se va declara de două ori și va emite o eroare de legătură. De fapt , clasa persoană va fi definită atât în fișierul person.o și în fișierul employee.o. În acest din urmă caz, cel al fișierului utilizat.o , este necesar să se introducă declarația de persoană din cauza directivei #include specificate.
Pentru a evita acest tip de problemă, pur și simplu folosiți #include protecții de acest fel:
persoana.h
#ifndef PERSONA_H
#define PERSONA_H
// toate celelalte
# endif // PERSONA_H
Cu acest truc, este inclusă prima dată persona.h , simbolul PERSONA_H nu a fost încă definit și, în consecință, este creat. Data viitoare când includeți persoana.h, PERSONA_H simbolul este definit, prin urmare, partea referitoare la definiția clasei de persoană nu este luată în considerare.
De regulă, protecțiile #include trebuie inserate în toate fișierele .h pentru a asigura o mai mare transparență programatorului evitând acest tip de eroare.
#pragma o dată
Următoarea este o alternativă echivalentă pentru a include gardieni, dar mai scurtă și mai simplă și uneori crește viteza de compilare.
persoana.h
#pragma o dată
//toate celelalte
Indică faptul că fișierul ar trebui să fie inclus o singură dată în compilație.
Portabilitate
Deși această directivă nu este definită în standardele C / C ++, este definită în aproape toate compilatoarele.
Compilator | #pragma o dată |
---|---|
Zăngăni | Sprijinit |
Comeau C / C ++ | Sprijinit |
C ++ Builder XE3 | Sprijinit |
Digital Mars C ++ | Sprijinit |
GCC | Sprijinit |
HP C / aC ++ | Sprijinit |
IBM XL C / C ++ | Sprijinit |
Compilator Intel C ++ | Sprijinit |
Microsoft Visual C ++ | Sprijinit |
Pelles C | Sprijinit |
ARM DS-5 | Sprijinit |
IAR C / C ++ | Sprijinit |
Solaris Studio C / C ++ | Nu sunt acceptate |