Ist #pragma einmal Teil des C ++ 11 Standards?
Traditionell, standard und portable Weg, um zu vermeiden, mehrere header-Einschlüsse in C++ war/ist die Verwendung der #ifndef - #define - #endif
pre-compiler-Direktiven-Schema auch als makro-guard-Schema (siehe code-snippet unten).
#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
...
#endif
In den meisten Implementierungen/Compiler (siehe Bild unten) jedoch gibt es eine "elegante" alternative, die demselben Zweck dient wie die makro-guard-System namens #pragma once
. #pragma once
hat mehrere Vorteile im Vergleich zu den makro-guard-System einschließlich weniger code, der Vermeidung der name-clashes, und manchmal verbessert kompilieren Geschwindigkeit.
Etwas Forschung zu tun, ich erkannte, dass, obwohl #pragma once
Richtlinie wird unterstützt, indem fast alle bekannten Compiler, es ist eine turbidness, ob #pragma once
Richtlinie ist Teil der C++11-standard oder nicht.
Fragen:
- Könnte jemand klären, ob
#pragma once
Richtlinie ist Teil der C++11-standard oder nicht? - Wenn es ist nicht Teil des C++11-standard, gibt es irgendwelche Pläne, einschließlich es auf späteren Veröffentlichungen (z.B., C++14 oder höher)?
- Es wäre auch schön, wenn jemand könnte, näher auf die Vorteile/Nachteile bei der Verwendung einer der Techniken (d.h., makro-guard gegen
#pragma once
).
InformationsquelleAutor der Frage 101010 | 2014-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
#pragma once
ist nicht standard. Es ist eine weit verbreitete (aber nichtuniversal) - Erweiterung, die verwendet werden können,
Wurde es als für die Standardisierung, aber abgelehnt, weil es
nicht zuverlässig umgesetzt werden. (Die Probleme, die auftreten, wenn Sie
haben die Dateien zugreifen, die durch verschiedene remote-mounts.)
Ist es ziemlich einfach, um sicherzustellen, dass es kein include-guard
Konflikte innerhalb einer einzigen Entwicklung. Für Bibliotheken, die möglicherweise
verwendet werden, durch viele verschiedene Entwicklungen, die offensichtliche Lösung ist
zum generieren einer Menge von zufälligen Zeichen für den include-guard
wenn Sie es schaffen. (Ein guter editor kann eingestellt werden, um dies für
Wann immer Sie öffnen einen neuen header.) Aber auch ohne diesen,
Ich habe noch Probleme mit Konflikten zwischen
Bibliotheken.
InformationsquelleAutor der Antwort James Kanze
§16.6 der Standard (N3936 Entwurf) beschreibt
#pragma
Richtlinien:Grundsätzlich
#pragma once
ist eine Implementierung spezifische Instanz einer#pragma
Richtlinie, und Nein, es ist nicht standard. Noch.Ist es oft stark unterstützt durch die meisten "bekannten Compiler" einschließlich GCC und Clang und wird deshalb manchmal empfohlen, um zu vermeiden,-Wachen beschränken.
InformationsquelleAutor der Antwort Shoe