once
pragma
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
.