#include Guard vs #pragma once
-
Hi,
was nutzt ihr in euren Projekten, die alten #include Guards oder #pragma once? Ich habe gelesen, dass mit #pragma once schneller, besser keine Ahnung was optimiert werden kann, da nicht gleich der Präprozessor angeworfen werden muss. Kann einer da mehr zu sagen?
-
Beides ;), ist ja nicht so, dass man nur eines haben könnte...
-
Ah, ich glaube ich verstehe
Also, zuerst das #pragma once und wenn es doch mal einen der großen Compiler geben sollte der dies nicht unterstützt dann kommt danach der #include guard, richtig?
-
Ich persönlich tu das #pragma vorsichtshalber immer in die Include Guards, aber vermutlich isses wurscht wie herum.
-
Butterbrot schrieb:
Ich habe gelesen, dass mit #pragma once schneller, besser keine Ahnung was optimiert werden kann, da nicht gleich der Präprozessor angeworfen werden muss. Kann einer da mehr zu sagen?
Der GCC machts mWn umgekehrt. Aber mal ehrlich: Ist dieser Zeitvorteil bei dir relevant? Das dürfte man erst in Projekten mit tausenden Headern und Millionen von Codezeilen merken.
-
Wusste doch, dass ich da gerade unlängst zufällig über was gestolpert war: http://tinodidriksen.com/2011/08/31/cpp-include-speed/

-
SeppJ schrieb:
Butterbrot schrieb:
Ich habe gelesen, dass mit #pragma once schneller, besser keine Ahnung was optimiert werden kann, da nicht gleich der Präprozessor angeworfen werden muss. Kann einer da mehr zu sagen?
Der GCC machts mWn umgekehrt. Aber mal ehrlich: Ist dieser Zeitvorteil bei dir relevant? Das dürfte man erst in Projekten mit tausenden Headern und Millionen von Codezeilen merken.
Ne nicht sonderlich relevant, nur Neugierde.
@dot: Netter Link, danke.
-
dot schrieb:
Wusste doch, dass ich da gerade unlängst zufällig über was gestolpert war: http://tinodidriksen.com/2011/08/31/cpp-include-speed/

Naja, etwas zweifelhafte Testmethode. Bei ifndef muss die komplette Datei gelesen werden, um das endif zu finden, bei pragma once kann man direkt abbrechen. Da die Dateien im Test nahezu leer sind, ist das sehr parteiisch getestet.
-
Michael E. schrieb:
Naja, etwas zweifelhafte Testmethode. Bei ifndef muss die komplette Datei gelesen werden, um das endif zu finden
Eben nicht. Der GCC erkennt typische include-Guards und merkt sich das. Siehe auch dessen Resultat für die ifdef-Methode.
-
SeppJ schrieb:
Eben nicht. Der GCC erkennt typische include-Guards und merkt sich das. Siehe auch dessen Resultat für die ifdef-Methode.
Wie soll das denn funktionieren, ohne die komplette Datei zu lesen?
Edit: Achso, beim ersten Verarbeiten der Datei wird gespeichert, dass das ifnef ein Include Guard ist?
-
Michael E. schrieb:
Edit: Achso, beim ersten Verarbeiten der Datei wird gespeichert, dass das ifnef ein Include Guard ist?
Exakt, genau darum gehts bei dem Ganzen ja...

-
Michael E. schrieb:
Edit: Achso, beim ersten Verarbeiten der Datei wird gespeichert, dass das ifnef ein Include Guard ist?
Was dann übrigens auch ziemlich genau das gleiche sein muss, wie
pragma oncebeim MS-Compiler implementiert ist, bloß mit anderem (standardkonformeren
) Schlüsselwort. Der muss sich schließlich auch irgendwie merken, welche Dateien er schon hatte und ob da ein pragma oncedrin stand.
-
#pragma onceist auch standardkonform... :p
-
Es ist kein offizieller Standard, wird sich aber kaum ein Compiler drüber beschweren. Wenn die Sache auch nicht gerade viel mehr Geschwindigkeit bringt, so kann man wenigstens auf drei Zeilen Includeguard + Namensfindung verzichten und schreibt einfach #pragma once und gut is.
-
dot schrieb:
#pragma onceist auch standardkonform... :pN3337 16.6 schrieb:
1. A preprocessing directive of the form
# pragma pp-tokensopt new-linecauses the implementation to behave in an implementation-defined manner.[...]
-
Sone schrieb:
[...]
Du musst schon noch dazu sagen, was du mit dem Zitat jetzt aussagen willst. Ich vermute mal dass du behaupten willst, #pragma once wäre nicht standardkonform. Das wäre allerdings falsch gedacht, es ist standardkonform, aber eben nicht portabel

-
Naja, welcher große Compiler kann nicht damit umgehen, so dass man sagen kann es wäre nicht portabel?

-
Butterbrot schrieb:
#include Guards oder #pragma once?
Ich verwende eigentlich immer ersteres, wobei ich derzeit ohnehin dazu gezwungen bin (Wenn man keine Includeguards mit exakt dem Dateinamen im C++ Builder verwendet, stellt er die Dateien nicht in Kombination dar und man kommt ggf. nur umständlich an den Inhalt).
-
Butterbrot schrieb:
Naja, welcher große Compiler kann nicht damit umgehen, so dass man sagen kann es wäre nicht portabel?

Es ist nicht portabel, weil zB. der gcc damit nicht das macht, was du eigentlich machen möchtest.
Dass andere Compiler nicht crashen, deine Browser-History löschen oä. macht das Beispiel noch lange nicht portabel – es passiert ja nicht das, was du haben möchtest.
-
Der GCC inkludiert die Dateien mit #pragma once nicht nur einmal, oder wie soll ich das verstehen mit dem "Es macht nicht das was du haben willst"?