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.

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, die Schutz-Idiom einzuschließen, wenn Code in Compiler portierbar sein muss, die die #pragma once Direktive nicht implementieren, um die Konsistenz mit vorhandenem Code zu Standard 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 onceals auch .

Siehe auch

Pragma-Direktiven und die __pragma und _Pragma Schlüsselwort (keyword)