443 Stimmen

Ist #pragma einmal ein sicherer Include-Schutz?

Ich habe gelesen, dass es eine Compiler-Optimierung gibt, wenn man #pragma once was zu einer schnelleren Kompilierung führen kann. Ich weiß, dass dies nicht dem Standard entspricht und daher ein Problem mit der plattformübergreifenden Kompatibilität darstellen könnte.

Ist dies etwas, das von den meisten modernen Compilern auf Nicht-Windows-Plattformen (gcc) unterstützt wird?

Ich möchte Probleme bei der Kompilierung von Plattformen vermeiden, aber auch die zusätzliche Arbeit von Fallback-Guards vermeiden:

#pragma once
#ifndef HEADER_H
#define HEADER_H

...

#endif // HEADER_H

Sollte ich mir Sorgen machen? Sollte ich weitere geistige Energie darauf verwenden?

404voto

Motti Punkte 104854

#pragma once hat einen Nachteil (abgesehen davon, dass es nicht standardisiert ist), und das ist, wenn Sie die gleiche Datei an verschiedenen Orten haben (wir haben dies, weil unser Build-System Dateien kopiert), dann wird der Compiler denken, dass dies verschiedene Dateien sind.

274voto

Zifre Punkte 25764

Verwendung von #pragma once sollte auf jedem modernen Compiler funktionieren, aber ich sehe keinen Grund, nicht einen Standard #ifndef Wache einschließen. Es funktioniert einwandfrei. Der einzige Nachteil ist, dass der GCC keine Unterstützung für #pragma once vor Version 3.4 .

Ich habe auch festgestellt, dass, zumindest auf GCC, sie erkennt den Standard an #ifndef Schutz einschließen und optimieren also sollte es nicht viel langsamer sein als #pragma once .

81voto

Michael Burr Punkte 320591

Ich wünsche mir #pragma once (oder etwas Ähnliches) in der Norm enthalten war. Einschließende Schutzmaßnahmen sind keine große Sache (aber sie scheinen für Leute, die die Sprache lernen, etwas schwierig zu erklären zu sein), aber es scheint ein kleines Ärgernis zu sein, das hätte vermieden werden können.

Da nämlich in 99,98 % der Fälle die #pragma once Verhalten das gewünschte Verhalten ist, wäre es schön gewesen, wenn das Verhindern der mehrfachen Einbindung eines Headers automatisch vom Compiler gehandhabt würde, mit einer #pragma oder etwas anderes, um eine doppelte Einbeziehung zu ermöglichen.

Aber wir haben, was wir haben (außer, dass Sie vielleicht nicht haben #pragma once ).

45voto

JaredPar Punkte 699699

Ich weiß nicht, ob es Leistungsvorteile gibt, aber es funktioniert auf jeden Fall. Ich verwende es in allen meinen C++-Projekten (natürlich verwende ich den MS-Compiler). Ich halte es für effektiver als die Verwendung von

#ifndef HEADERNAME_H
#define HEADERNAME_H
...
#endif

Es erfüllt die gleiche Aufgabe und füllt den Präprozessor nicht mit zusätzlichen Makros.

GCC unterstützt #pragma once offiziell ab Version 3.4 .

32voto

uceumern Punkte 838

GCC unterstützt #pragma once seit 3.4, siehe http://en.wikipedia.org/wiki/Pragma_once für weitere Compiler-Unterstützung.

Der große Vorteil, den ich in der Verwendung von #pragma once im Gegensatz zu Include Guards ist, um Kopier-/Einfügefehler zu vermeiden.

Seien wir ehrlich: Die meisten von uns fangen kaum eine neue Header-Datei von Grund auf an, sondern kopieren einfach eine bestehende und passen sie an unsere Bedürfnisse an. Es ist viel einfacher, eine funktionierende Vorlage zu erstellen, indem man #pragma once anstelle von Include-Guards. Je weniger ich die Vorlage ändern muss, desto geringer ist die Wahrscheinlichkeit, dass ich auf Fehler stoße. Dieselbe Include-Guard in verschiedenen Dateien zu haben, führt zu seltsamen Compiler-Fehlern, und es dauert einige Zeit, um herauszufinden, was falsch gelaufen ist.

TL;DR: #pragma once ist einfacher zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X