Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Określa, że kompilator zawiera plik nagłówka tylko raz podczas kompilowania pliku kodu źródłowego.
Składnia
#pragma once
Uwagi
Użycie programu #pragma once
może skrócić czas kompilacji, ponieważ kompilator nie będzie otwierał i odczytywał plik ponownie po pierwszym #include
pliku w jednostce tłumaczenia. Jest to nazywane optymalizacją wielokrotnego dołączania. Ma on efekt podobny do dołączania idiomu guard , który używa definicji makr preprocesora, aby zapobiec wielu dołączaniu zawartości pliku. Pomaga to również zapobiegać naruszeniom jednej reguły definicji: wymaganie, aby wszystkie szablony, typy, funkcje i obiekty nie miały więcej niż jednej definicji w kodzie.
Na przykład:
// header.h
#pragma once
// Code placed here is included only once per translation unit
Zalecamy dyrektywę #pragma once
dotyczącą nowego kodu, ponieważ nie zanieczyszcza globalnej przestrzeni nazw symbolem preprocesora. Wymaga mniej pisania, jest mniej rozpraszający i nie może powodować kolizji symboli. Kolizje symboli są spowodowane błędami, gdy różne pliki nagłówka używają tego samego symbolu preprocesora co wartość ochrony. Nie jest on częścią standardu C++, ale jest implementowany w sposób przenośny przez kilka typowych kompilatorów.
Nie ma żadnej korzyści, aby korzystać zarówno z idiomu include guard, jak i #pragma once
w tym samym pliku. Kompilator rozpoznaje idiom funkcji include guard i implementuje optymalizację wielokrotnego dołączania w taki sam sposób jak #pragma once
dyrektywa, jeśli nie ma kodu komentarza lub dyrektywy preprocesora przed lub po standardowej formie idiomu:
// header.h
// Demonstration of the #include guard idiom.
// Note that the defined symbol can be arbitrary.
#ifndef HEADER_H_ // equivalently, #if !defined HEADER_H_
#define HEADER_H_
// Code placed here is included only once per translation unit
#endif // HEADER_H_
Zalecamy włączenie idiomu ochrony, gdy kod musi być przenośny do kompilatorów, które nie implementują #pragma once
dyrektywy, aby zachować spójność z istniejącym kodem lub gdy optymalizacja wielokrotnego dołączania jest niemożliwa. Może wystąpić w złożonych projektach, gdy aliasy systemu plików lub aliasy dołączane ścieżki uniemożliwiają kompilatorowi identyfikację identycznych plików dołączanych według ścieżki kanonicznej.
Należy zachować ostrożność, aby nie używać #pragma once
ani dołączać idiom osłony w plikach nagłówkowych zaprojektowanych do wielokrotnego dołączania, które używają symboli preprocesora do kontrolowania ich efektów. Aby zapoznać się z przykładem tego projektu, zobacz plik nagłówka <assert.h> . Należy również zachować ostrożność, aby zarządzać ścieżkami dołączania, aby uniknąć tworzenia wielu ścieżek do dołączonych plików, co może pokonać optymalizację wielokrotnego dołączania zarówno w przypadku ochrony, jak i #pragma once
.