2010-02-04 9 views
6

Wiem, że zapobiega wielokrotnemu włączaniu pliku nagłówkowego. Ale załóżmy, że upewnię się, że zawieram ten plik tylko w jednym pliku .cpp tylko raz. Czy są jeszcze scenariusze, w których potrzebowałbym tego bezpiecznego strażnika?Cel #ifndef FILENAME .... # endif w pliku nagłówkowym

+0

Dziękuję wszystkim. Chris dostaje to za rozwinięcie :) – deeJ

+0

Następnym razem, gdy będę musiał złamać moją czapkę ponownie, będę tylko pamiętać, aby opublikować podczas odwlekając moją pracę domową. :) –

Odpowiedz

7

można zagwarantować, że kod obejmuje go tylko raz, ale można zagwarantować, że ktoś „s kod obejmie go raz?

Ponadto wyobrazić to:

// a.h 
typedef struct { int x; int y; } type1; 

// b.h 
#include "a.h" 
typedef struct { type1 old; int z; } type2; 

// main.c 
#include "a.h" 
#include "b.h" 

Och, nie! Nasz main.c zawiera tylko jeden raz, ale b.h zawiera a.h, więc otrzymaliśmy a.h dwa razy, pomimo naszych najlepszych starań.

Wyobraźmy sobie teraz to ukryte za trzema lub więcej warstwami #include s i jest to niewielki nagłówek tylko do użytku wewnętrznego, który jest dołączany dwa razy i jest to problem, ponieważ jeden z nagłówków #undef wydał zdefiniowane makro, ale drugi nagłówek #define d ponownie i złamał kod, a kilka godzin zajęło ustalenie, dlaczego istnieją sprzeczne definicje.

12

Nie, to jest jedyny cel strażników, ale ich używanie nie powinno sprawić kłopotu: wykonanie tego zajmuje niewiele czasu i potencjalnie pozwala zaoszczędzić dużo.

1

To jedyna racja stanu. Nadal jest to dobry pomysł, nawet jeśli myślisz, że masz to pokryte; nie spowalnia to twojego kodu ani niczego, i nigdy nie boli, aby mieć dodatkową straż.

1

Celem strażnika jest uniemożliwienie pliku ponownie dołączonego do tego samego pliku .cpp więcej niż raz. Nie chroni przed dołączaniem pliku do więcej niż jednego pliku .cpp.

Jeśli masz pewność, że plik nagłówkowy nie znajduje się w innym pliku nagłówkowym, to osłona nie jest wymagana. ale nadal jest to dobra forma.

nawet lepsza forma jest użycie

#pragma once 

jeśli kompilator obsługuje.

+0

Dołączony strażnik jest lepszy IMHO, ponieważ jest bardziej przenośny. Unikam polegania na cechach specyficznych dla kompilatora, takich jak dżuma. –

+2

@ Chris: przenośność ma znaczenie dla kodu open source. Ale zwykle nie dla zamkniętego źródła. #pragma raz jest bardziej niezawodny i szybszy niż osłony, ponieważ kompilator może faktycznie _skip_ ponownie skanować plik. To jest coś, co ma znaczenie w sklepie z zamkniętymi źródłami. –

+0

GCC faktycznie optymalizuje idiom towarzyszący strażnikowi, aby zrobić to samo. Ale zgadzam się, że dla kodu z zamkniętym kodem źródłowym przy użyciu Visual Studio, '#pragma once' jest całkiem w porządku. –

1

Upewnienie się, że kod jest zawarty tylko raz, jest wyłącznym celem tzw. "Straży nagłówka".

Może to być przydatne, ponieważ istnieje gdzieś okrężna zależność między plikami nagłówkowymi, nie daj się złapać w niekończącą się pętlę dołączania plików.

0

Dodatkowym scenariuszem, jaki mogę wymyślić (i zrobiliśmy to) jest stworzenie masek C++.

W swojej kompilacji jawnie określasz wartość GUARD pliku, a następnie jesteś w stanie dodać swoją własną symulację poprzez -include my_mock.h jako dodatkową opcję kompilatora (użyliśmy g ++).

my_mock.h 

#define THAT_FILE_GUARD 

class ThatClass 
{ 
    void connect() 
    { 
    std::cout << "mock connect" << std::endl; 
    } 
} 
0

Korzystanie strażnika nagłówka tak przyspiesza proces kompilacji, wyobraź sobie trzy plików źródłowych przy użyciu nagłówka (minus strażnika nagłówku), które z kolei oznaczałoby kompilator musiałby zawierać nagłówek (parsowania i lexing składni) wiele razy.

W przypadku osłony nagłówka kompilator powie "Ha! Widziałem to już wcześniej i nie, nie będę parsować składni ", a tym samym przyspieszyć proces kompilacji.

Mam nadzieję, że to pomoże, Pozdrawiam, Tom.

Powiązane problemy