web-dev-qa-db-ger.com

Ist #pragma einmal Teil des C ++ 11-Standards?

Traditionell bestand die übliche und tragbare Möglichkeit, mehrfache Header-Einschlüsse in C++ zu vermeiden, in der Verwendung von #ifndef - #define - #endifPre-Compiler-Direktiven-Schema, auch Makro-Guard-Schema genannt (siehe Code-Snippet unten).

#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
...
#endif

In den meisten Implementierungen/Compilern (siehe Bild unten) gibt es jedoch eine "elegantere" Alternative, die denselben Zweck erfüllt wie das Makro-Guard-Schema #pragma once . #pragma once hat im Vergleich zum Makro-Guard-Schema mehrere Vorteile, darunter weniger Code, Vermeidung von Namenskonflikten und manchmal eine verbesserte Kompiliergeschwindigkeit.

enter image description here

Als ich ein bisschen recherchierte, wurde mir klar, dass #pragma onceDirektive wird von fast allen bekannten Compilern unterstützt, es ist unklar, ob #pragma once Direktive ist Teil des C++ 11 Standards oder nicht.

Fragen:

  • Könnte jemand klären, ob #pragma once Direktive ist Teil des C++ 11 Standards oder nicht?
  • Wenn es nicht Teil des C++ 11-Standards ist, gibt es Pläne, es in späteren Releases (z. B. C++ 14 oder höher) aufzunehmen?
  • Es wäre auch schön, wenn jemand die Vor- und Nachteile einer der beiden Techniken (d. H. Makroschutz im Vergleich zu #pragma once).
133
101010

#pragma once ist nicht Standard. Es ist eine weit verbreitete (aber nicht universelle) Erweiterung, die verwendet werden kann

  • wenn Ihre Bedenken hinsichtlich der Portabilität begrenzt sind und
  • sie können sicher sein, dass sich alle Ihre Include-Dateien immer auf einem lokalen Datenträger befinden.

Es wurde für die Standardisierung in Betracht gezogen, aber abgelehnt, da es nicht zuverlässig implementiert werden kann. (Die Probleme treten auf, wenn auf Dateien über verschiedene Remote-Bereitstellungen zugegriffen werden kann.)

Es ist ziemlich einfach sicherzustellen, dass es innerhalb einer einzelnen Entwicklung keine Schutzkonflikte gibt. Für Bibliotheken, die von vielen verschiedenen Entwicklungen verwendet werden können, besteht die offensichtliche Lösung darin, beim Erstellen des Include-Schutzes viele zufällige Zeichen zu generieren. (Ein guter Editor kann dafür eingerichtet werden, wenn Sie einen neuen Header öffnen.) Aber auch ohne diesen Editor habe ich noch keine Probleme mit Konflikten zwischen Bibliotheken.

103
James Kanze

Abschnitt 16.6 der Norm ( N3936 Entwurf) beschreibt #pragma Anweisungen als:

Eine Vorverarbeitungs-Direktive des Formulars

# pragma pp-tokensopt new-line

bewirkt ein implementierungsdefiniertes Verhalten der Implementierung. Das Verhalten kann dazu führen, dass die Übersetzung fehlschlägt oder dass sich der Übersetzer oder das resultierende Programm nicht konform verhält. Jedes Pragma, das von der Implementierung nicht erkannt wird, wird ignoriert.

Grundsätzlich gilt #pragma once ist eine implementierungsspezifische Instanz eines #pragma Direktive, und nein, es ist nicht Standard. Noch.

Es wird häufig von den meisten "großen Compilern" unterstützt, einschließlich GCC und Clang , und wird daher manchmal empfohlen, die Boilerplate von Include-Guards zu vermeiden .

32
Shoe