2010-06-05 9 views
8

W języku C++, jaki jest cel ochrony nagłówka w programie C++.Cel osłon nagłówka

Z sieci wynika, że ​​zapobiega ponownemu włączaniu plików, ale w jaki sposób gwarantuje to osłona nagłówka.

+0

Przyjęty termin na to w C++ to "należy do strażnika". –

+0

Wikipedia podaje [bardzo dobre wytłumaczenie] (http://en.wikipedia.org/wiki/Include_guard) na temat tego, jak działają strażnicy. –

Odpowiedz

14

Nagłówek strażnika ma zapobiegać problemom, jeśli plik nagłówkowy jest zawarty więcej niż jeden raz; na przykład

#ifndef MARKER 
#define MARKER 
// declarations 
#endif 

Po raz pierwszy ten plik jest #include -ed, symbol MARKER preprocesor będą niezdefiniowane, więc preprocesor zdefiniuje symbol oraz następujące deklaracje zawarte w kodzie źródłowym widziana przez kompilator. W następnym symbolu #include zostanie zdefiniowany symbol MARKER, a zatem wszystko w obrębie obiektu #ifnde/#endif zostanie usunięte przez preprocesor.

Aby to działało poprawnie, symbol MARKER musi być inny dla każdego pliku nagłówkowego, który może być #include -ed.

Powodem tego rodzaju rzeczy jest to, że jest to nielegalne w C/C++, aby zdefiniować typ lub funkcję o tej samej nazwie więcej niż jeden raz w jednostce kompilacji. Strażnik zezwala na pliki nagłówkowe na #include innych plików nagłówkowych bez obawy, że może to powodować wielokrotne dołączanie niektórych deklaracji.


W skrócie, to nie uniemożliwia pochodzisz #include znowu i znowu -ing pliku. Raczej pozwala zrobić to bez powodowania błędów kompilacji.

2

Celem osłon nagłówka jest zapobieganie problemom, w których niektóre kody mogą pojawić się tylko jeden raz na jednostkę tłumaczeniową.

Jednym z przykładów jest struktura. Nie można przedefiniować struktury, nawet jeśli druga definicja jest identyczna. Tak więc, jeśli próbujesz skompilować następujące:

struct foo { int x; }; 
struct foo { int x; }; 

Kompilator zakończy się niepowodzeniem z powodu ponownego zdefiniowania.

Może być trudno zagwarantować, że nagłówek zostanie dołączony tylko raz (dzieje się tak, gdy nagłówki zawierają inne nagłówki). Jeśli twój nagłówek ma definicję struktury, spowoduje to awarię kompilacji. Nagłówki są łatwą lewą, więc nawet jeśli nagłówek jest dołączany wiele razy, zawartość pojawia się tylko jeden raz.