once
pragma
Gibt an, dass der Compiler die Headerdatei nur einmal enthält, wenn eine Quellcodedatei kompiliert wird.
Syntax
#pragma once
Hinweise
Die Verwendung kann #pragma once
die Erstellungszeiten verringern, da der Compiler die Datei nach der ersten #include
Datei in der Übersetzungseinheit nicht mehr öffnet und erneut liest. Es wird als Optimierung mit mehreren Einschließen bezeichnet. Sie hat eine Ähnliche Wirkung wie das Include Guard-Idiom , das Präprozessormakrodefinitionen verwendet, um mehrere Einschlüsse des Inhalts der Datei zu verhindern. Außerdem hilft es, Verstöße gegen die eine Definitionsregel zu verhindern: Die Anforderung, dass alle Vorlagen, Typen, Funktionen und Objekte nicht mehr als eine Definition in Ihrem Code aufweisen.
Zum Beispiel:
// header.h
#pragma once
// Code placed here is included only once per translation unit
Wir empfehlen die #pragma once
-Richtlinie für neuen Code, da sie den globalen Namespace nicht mit einem Präprozessorsymbol verunreinigt. Es erfordert weniger Eingabe, es ist weniger ablenkend und kann keine Symbolkollisionen verursachen. Symbolkonflikte sind Fehler, wenn verschiedene Headerdateien dasselbe Präprozessorsymbol wie der Schutzwert verwenden. Es ist nicht Teil des C++-Standards, aber es wird portabel von mehreren gängigen Compilern implementiert.
Es gibt keinen Vorteil, sowohl den Schutz-Idiom #pragma once
als auch in derselben Datei zu verwenden. Der Compiler erkennt das Include Guard-Idiom und implementiert die Mehrfacheinschließoptimierung auf die gleiche Weise wie die #pragma once
Direktive, wenn kein Nichtkommentarcode oder Präprozessordirektive vor oder nach der Standardform des Idioms liegt:
// 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_
Es wird empfohlen, den Schutz-Idiom einzuschließen, wenn Code in Compiler portierbar sein muss, die die #pragma once
Direktive nicht implementieren, um die Konsistenz mit vorhandenem Code aufrechtzuerhalten oder wenn die Optimierung mit mehreren Einschließen unmöglich ist. Es kann in komplexen Projekten auftreten, wenn Dateisystemaliasing oder aliasierte Pfade verhindern, dass der Compiler identische Includedateien anhand des kanonischen Pfads identifiziert.
Achten Sie darauf, keine Schutz-Idiom in Headerdateien zu verwenden #pragma once
, die mehrmals eingeschlossen werden sollen, die Präprozessorsymbole verwenden, um ihre Effekte zu steuern. Ein Beispiel für diesen Entwurf finden Sie in der <Headerdatei "assert.h> ". Achten Sie auch darauf, Ihre eingeschlossenen Pfade zu verwalten, um zu vermeiden, dass mehrere Pfade zu eingeschlossenen Dateien erstellt werden, was die Optimierung mehrerer Einschließen für sowohl Schutzkräfte #pragma once
als auch .