#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.


  • Mod

    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.


  • Mod

    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... 😉


  • Mod

    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 once beim 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 once drin stand.



  • #pragma once ist 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 once ist auch standardkonform... :p

    N3337 16.6 schrieb:

    1. A preprocessing directive of the form

    # pragma pp-tokensopt new-line
    

    causes 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"?


Anmelden zum Antworten