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.

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.

Zobacz też

Dyrektywy Pragma i __pragma słowa kluczowe i _Pragma