2010-01-10 12 views

Odpowiedz

14

Jest to tak zwany "włącz straży". Ma to na celu uniemożliwienie wielokrotnego analizowania pliku, jeśli jest on dołączany wiele razy.

+0

I zapobiega wielu definicji tej samej klasy. – James

+1

Czy istniała kiedykolwiek dyrektywa #import, czy to tylko moja wyobraźnia? –

+2

@Autopulated: To właśnie ma na myśli, pisząc wielokrotnie. Jest o wiele więcej rzeczy niż obaw o przeróbki klas; wszystkie są enkapsulowane przez "wielokrotne parsowanie". – GManNickG

3

Nazywa się to strażnik. Możesz pisać bez nich, dopóki nie zaczniesz pisać dużych programów i zobaczysz, że musisz dołączyć ten sam plik .h więcej niż jeden raz, bezpośrednio lub pośrednio, z pliku .c. Następnie bez załączników otrzymasz wiele błędów definicji, ale z nimi zawartość pliku nagłówkowego jest analizowana tylko raz i pomijane wszystkie kolejne razy, unikając tych błędów. Dobrą praktyką jest zawsze ich używać.

4

Zapobiega wielu wtrąceniom pojedynczego pliku. To samo można zrobić, stosując dyrektywę

, ale te #ifldefs są standardowe, dlatego są obsługiwane przez każdy kompilator.

+3

#pragma raz. Jest rozszerzeniem specyficznym dla kompilatora. –

+0

... ale szeroko obsługiwany, aby być sprawiedliwym –

-1

Jeśli plik nagłówka zawiera definicję, taką jak

int i;
, wówczas, gdy jest on dołączany kilka razy bez osłony, spowoduje błąd kompilacji.
ifndef sprawdza, czy jakaś zmienna preprocesora nie jest zdefiniowana (i nie jest, po raz pierwszy), a następnie definiuje ją jawnie, aby uniknąć ponownego przechwycenia. W MSVC można również użyć
#pragma once
zamiast ifndef.

1

Jeśli dobrze rozumiem, chcesz wiedzieć, czy w przypadku braku osłon włączających wielokrotne dołączenie pliku nagłówkowego może spowodować błąd lub niebezpieczne zachowanie. To jest po wykluczeniu wielu definicji, itp.

Wyobraź sobie złośliwego programistę, którego plik nagłówkowy nie ma osłony. Jego plik nagłówkowy definiuje jedno makro, SZ, które jest rozmiarem używanym do statycznie przydzielonych tablic. Programista może napisać swój plik nagłówka tak:

#ifndef SZ 
#define SZ 1024 
#else 
#if SZ == 1024 
#undef SZ 
#define SZ 128 
#else 
#error "You can include me no more than two times!" 
#endif 
#endif 

Teraz, jeśli to plik nagłówka raz, masz SZ równą 1024. Jeśli to go dwukrotnie, SZ staje 128. Oczywiście, najbardziej real- światowi programiści nie są złośliwi i nikt tak naprawdę nie pisze kodu jak wyżej.

Należy zauważyć, że średnia C pozwala assert.h być #include d więcej niż raz różne zachowania w zależności od tego, czy NDEBUG określa się w momencie włączenia assert.h. Tak więc assert.h nie może zawierać strażników. To jest funkcja, a nie błąd.