#include Guard vs #pragma once



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



  • Einfach beides verwenden, völlig standardkonform, portabel und dann gibts garantiert kein Problem...



  • pumuckl schrieb:

    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 😉

    Nein, es ist standardkonform - es kompiliert ja!
    Es ist lediglich Implementationsspezifisch ob es ignoriert wird oder nicht.



  • Sone schrieb:

    Nein, es ist standardkonform - es kompiliert ja!
    Es ist lediglich Implementationsspezifisch ob es ignoriert wird oder nicht.

    Exakt

    Und jetzt denk drüber nach, wieso man Include Guards überhaupt verwendet... 😉



  • Da wir nun raus gefunden haben, dass #pragma once keinen großen Einfluss auf die Geschwindigkeit des Kompilierens hat(jedenfalls bei kurzen Dateien) habe ich immer noch die Frage, ob es portabel ist oder nicht?

    Nman sagt nein. Ich denke ja, wenn man nur für Windows/Linux/OSX, mit den dort gängigen Compilern entwickelt.

    Nicht portabel wäre es, in meinen Augen, wenn ich es nur unter einem System nutzen könnten, aber so wie ich es verstanden habe reicht mir ein #pragma once in den Header-Dateien und es erfüllt seinen Zweck auch für die großen Compilern auf den großen drei Systemen.



  • Butterbrot schrieb:

    Da wir nun raus gefunden haben, dass #pragma once keinen großen Einfluss auf die Geschwindigkeit des Kompilierens hat(jedenfalls bei kurzen Dateien) habe ich immer noch die Frage, ob es portabel ist oder nicht?

    Die Frage ist doch dadurch gelöst, dass es für die Geschwindigkeit nichts bringt.
    Dadurch ist klar, dass man pragma once nicht verwenden sollte.



  • Butterbrot schrieb:

    Nman sagt nein. Ich denke ja, wenn man nur für Windows/Linux/OSX, mit den dort gängigen Compilern entwickelt.

    Weil ich nicht wusste, dass die großen Compiler mittlerweile auch tatsächlich alle das richtige machen.

    Aber deine Definition von portabel ist auch interessant. Meine Programme sind alle portabel solange du auf einem 32bit WinXP SP3 entwickelst. 🤡



  • Shade Of Mine schrieb:

    Butterbrot schrieb:

    Da wir nun raus gefunden haben, dass #pragma once keinen großen Einfluss auf die Geschwindigkeit des Kompilierens hat(jedenfalls bei kurzen Dateien) habe ich immer noch die Frage, ob es portabel ist oder nicht?

    Die Frage ist doch dadurch gelöst, dass es für die Geschwindigkeit nichts bringt.
    Dadurch ist klar, dass man pragma once nicht verwenden sollte.

    Das ist falsch, es erspart dir drei Zeilen überflüssigen Includeguardcode mit eventuellen Konflikten der per define gesetzten Namen, z.B durch kopierte Headedateien für die nächste Klasse etc.

    #pragma once hat dadurch einfach mehr Vor- als Nachteile.

    nman schrieb:

    Aber deine Definition von portabel ist auch interessant. Meine Programme sind alle portabel solange du auf einem 32bit WinXP SP3 entwickelst.

    Wo habe ich das geschrieben? Wieso kann ich nicht unter Windows portable Anwendungen entwickeln?


Anmelden zum Antworten