2013-07-19 15 views
6

#pragma once ist kein Standard, wird aber von Compilern wie gcc und VC++ unterstützt. Es hilft, Inklusionswächter zu vermeiden.Fügt #pragma einmal Inklusionswächter hinzu?

Aber, intern, fügt der Compiler inclosure guards für #pragma einmal hinzu? Wenn nicht, wie stellt der Compiler sicher, dass ein solcher Header nur einmal enthalten ist?

+0

Ich denke, der Compiler verfolgt einfach, welche Header-Dateien enthalten sind und wo. –

+0

Wahrscheinlich etwas ähnliches zu einem Zyklus in einem gerichteten Diagramm zu erkennen –

+0

@OliCharlesworth Möglichkeit kann nicht vermieden werden, aber in großen Projekt, kann es nicht Tausende von Header-Dateien sein? Also wird es ein effizienter Weg sein? –

Antwort

10

Ich bin mir sicher, es funktioniert genau wie include_once in PHP - es gibt eine Tabelle von "Dateien, die enthalten ist". Der Compiler sucht in diesem Fall in der Liste nach der Datei, die er aufnehmen soll. Wenn eine Datei bereits enthalten ist, fügen Sie sie nicht erneut ein. Wenn der Compiler beim Verarbeiten der Datei eine #pragma once sieht, fügen Sie diese Datei zu "Dateien hinzu, die bereits enthalten sind".

Es ist also nicht das gleiche wie Inklusionswachen auf einer Detailebene, aber es hat die gleiche Wirkung wie Inklusionswachen. Es macht auch den Code weniger portabel, da es viele Compiler gibt, die dies nicht unterstützen.

+3

Eigentlich unterstützen alle primären Compiler es heutzutage. –

+2

"all primary" deckt wahrscheinlich den größten Teil des Embedded-Marktes nicht ab ... Und wenn ich darauf hingewiesen werde, dass "das nicht funktioniert, wenn der Code in einem eingebetteten Compiler kompiliert wird", bin ich mir sicher benutze es wieder bei anderen, wenn ihr Argument in diesem Punkt fehlschlägt ...;) –

+1

Ich habe es genossen, Anwendungen für viele Embedded-Lösungen mit '#pragma once' in GCC seit 4.4.0 zu schreiben. Es macht Spaß, Argumente basierend auf der Annahme zu machen, dass jemand noch nie von einer eingebetteten Entwicklungsumgebung gehört oder gesehen hat, aber in der Regel vorsichtig ist, zuerst die Fakten zu überprüfen. ;) –

0

Nein, der Compiler wird keine Wächter hinzufügen, aber das sollte keine Rolle spielen, da es nicht die gleiche Datei wieder enthält, so dass es niemals eine Änderung geben würde, diese Wächter an erster Stelle zu bewerten.

+0

Das ist eigentlich meine Frage, wie es die gleiche Datei nicht aufnehmen soll. –

+1

@ppk: Es kann verfolgen, welche Dateinamen es bereits '# include'd mit Computer-Speicher ist. Dies ist keine Frage. Woher weißt du, dass du dieselbe Frage nicht zweimal auf SO stellen musst? –

+2

Eine bemerkenswerte Ausnahme: Wenn die gleiche Datei über zwei verschiedene Dateinamen (z. B. Symlinks oder Hardlinks auf einem * nix-System) enthalten ist, kann '#pragma once' nicht geschützt werden, wie es ist basierend auf dem Dateinamen. Während typische "#ifndef/# define" -Wächter immer noch funktionieren. – abelenky

-2

Wenn "#pragma once" zur Datei "file.h" hinzugefügt wird, hilft der Compiler uns sicherzustellen, dass "file.h" nur geöffnet wird.

Aber wenn ich eine Kopie von "file.h" namens "file_copy.h" habe, wird es, wenn es enthalten ist, geöffnet.

+1

Das ist _what_ es tut, nicht _how_. –

+0

Ja, tut mir leid. –

Verwandte Themen