Es hängt davon ab, wie viel portable Ihr Programm zu erwarten ist.
Solange Sie ein Programm schreiben, das mit Compilern arbeiten soll, von denen Sie sicher wissen, dass sie #prama once
unterstützen, sollte nur die Verwendung von #pragma once
ausreichen. Wenn Sie dies tun, beschränken Sie Ihr Programm auf Compiler, die das implementierungsdefinierte Feature unterstützen.
Wenn Sie Ihr Programm benötigen, um auf alle Compiler zu arbeiten, dann sollten Sie #pragma once
verwenden und Wachen beide enthalten.
Falls ein Compiler nicht #pragma once
es einfach ignorieren unterstützt wird es [Ref # 1], in einem solchen Fall die Kopf Wachen Sie den Zweck dienen, also nichts falsch in ihnen mit beiden, wenn Sie nicht bewusst sind, von Features, die von Ihren Zielcompilern unterstützt werden.
Wenn Sie also möchten, dass Ihr Programm zu 100% portabel auf verschiedenen Compilern ist, ist der ideale Weg, nur die Include-Wächter zu verwenden. Wie @CharlesBailey zu Recht darauf hinweist, da das Verhalten für #pragma once
Implementierung definiert ist, kann sich das Verhalten auf einem unbekannten Compiler nachteilig auf Ihr Programm auswirken.
[Ref # 1]
Standard C++ 03: 16,6 Pragma Direktive
Eine Präprozessordirektive des Formulars
# pragma pp-tokensopt new-line
bewirkt, dass die Implementierung, um sich in einer implementierungsdefinierten Weise zu verhalten. Jedes Pragma, das von der Implementierung nicht erkannt wird, wird ignoriert.
Denken Sie daran, dass ältere Versionen der aufgelisteten Compiler dies möglicherweise nicht unterstützen. Wenn Sie also ein Open-Source-Programm erstellen, dessen Quelle verteilt werden soll, funktioniert das Pragma möglicherweise nicht. –
Es geht nicht nur um Compilerunterstützung, sondern auch darum, wie kompliziert die Umgebung ist. Vertrauen Sie dem Compiler, * sicher * zu wissen, ob zwei Dateien gleich sind oder nicht, einschließlich aller mount-Dateien und symbolischer Links? –
auch Hilfswerkzeuge wie Indexer und Analysatoren berücksichtigen. Möglicherweise ist kein vollständiger Präprozessor oder Parser dahinter, wie es für den Compiler der Fall ist. – justin