Include Wrapping



  • Hallo!

    Warum soll folgendes die Compilegeschwindigkeit erhöhen?

    #ifndef myHeader_h__
    #include "myHeader.h"
    #endif
    

    Danke schonmal!

    Niels



  • Weil der Header kein zweites mal (unnötigerweise) included wird.. Allerdings muss myHeader_h__ auch gesetzt werden.



  • nielsp schrieb:

    Hallo!

    Warum soll folgendes die Compilegeschwindigkeit erhöhen?

    #ifndef myHeader_h__
    #include "myHeader.h"
    #endif
    

    Solch Code kenne ich nur noch aus alten Uhrzeiten. Includeguards (die tatsächlich u.a. die Compilegeschwindigkeit erhöhen) setzt man eigentlich in der betroffenen Datei und nicht um das Include herum. Ich sehe obiges eher als Unsitte an.



  • Ich sehe obiges eher als Unsitte an.

    Hmm. Ich sehe das eigentlich nicht als direkten Headerguard an. Es kann ja durchaus auch Sinn machen, wenn im Header selbst bereits Gurads vorhanden sind. Der Präprozessor muss da die Datei gar nicht erst öffnen. Könnte somit ja eigentlich als Standardkonformes pragma once gelten. Ich weiss nicht, wie viel es wirklich ausmacht, aber ganz ohne Wirkung wird es nicht sein.


  • Mod

    Also zumindest der gcc behandelt include guards in Headerdateien seit geraumer Zeit genauso wie pragma once. Das heißt er liest dann tatsächlich nur die ersten paar Zeilen, anstatt erst die ganze Datei zu Inkludieren und dann alles zu verwerfen.



  • SeppJ schrieb:

    Also zumindest der gcc behandelt include guards in Headerdateien seit geraumer Zeit genauso wie pragma once. Das heißt er liest dann tatsächlich nur die ersten paar Zeilen, anstatt erst die ganze Datei zu Inkludieren und dann alles zu verwerfen.

    pragma once macht aber unter Windows etwas klein wenig anderes:

    http://msdn.microsoft.com/en-us/library/4141z1cx.aspx

    Er öffnet die Datei gar nicht erst erneut. Das macht ja auch was aus. Und mit einem solchen #define vor dem includen in eine andere Datei simuliert man ja das auch. Die Frage ist nur, was teurer ist. Das ifndef oder das schnelle öffnen und schauen.


  • Mod

    Ich hab's nochmal nachgelesen. Mittlerweile ist es sogar so, dass Dateien mit Include guards beim gcc gar nicht erst ein zweites Mal geöffnet werden, so wie beim MS Compiler das pragma once. Da das Feature schon eine Weile drin ist, und Microsoft auch keine schlechten Compiler schreibt, würde ich darauf wetten, dass deren Compiler das auch kann.

    edit: Hier noch zum Selbstlesen: http://gcc.gnu.org/onlinedocs/cppinternals/Guard-Macros.html



  • Kann ich mir auch gut vorstellen, dass das auch bei MS so ist. Allerdings habe ich ja gesagt, dass ich das als Standardkonformes pramga once sehe. Ob es Heutzutage noch nötig ist, oder nicht sei dahingestellt. 😉


Anmelden zum Antworten