#pragma once



  • Original erstellt von Noesis:
    #ifdef _MSC_VER > 1000
    also das heißt wahrsch. dass er pragma erst ab einer bestimmten version kann (>1000) und ansonsten muss weiterhin das #ifdef verwendet werden, was aber nicht so sicher zu sein scheint (für MS) dass MS extra noch ne pragma anweisung macht

    Das hat mich ja gerade gewundert, dass er das doppelt macht... Wer weiß wofür es gut ist 🙂



  • na pragma ist sicherer (achtung - meine gedankenwelt) deshalb versucht der msvc das zu benutzen, aber weil auch ein alter compiler verwendet werden soll (das makro ms_ver < 1000 ist, was auch immer es bedeutet :)) oder kein msvc gibt es noch die normalen include guars.



  • stellt euch mal vor, der würde das nicht 'doppelt' machen.
    und ihr wollt den code dann irgendwann mal auf einen anderen compiler kompilieren...



  • Original erstellt von Shade Of Mine:
    stellt euch mal vor, der würde das nicht 'doppelt' machen.
    und ihr wollt den code dann irgendwann mal auf einen anderen compiler kompilieren...

    Auch dann würde doch die Lösung mit den Defines ausreichen, oder. Ich kenne keinen Compiler der das nicht unterstützt...



  • Bau mal ein riesiges Projekt. Und schreib einmal in alle Include dateien ein #pragma once und einmal nicht. Dann wirst du gigantische unterschiede in der Buildtime feststellen. Warum auch immer compiliert der MSVC schneller mit #pragma once. Andere Compiler brauchen so einen mist nicht.



  • Original erstellt von Helium:
    Warum auch immer compiliert der MSVC schneller mit #pragma once. Andere Compiler brauchen so einen mist nicht.

    Falsch.

    Der VC++ öffnet eine Datei einfach kein zweitesmal wenn ein #pragma once drinnen vorkommt. dh man spart sich ne Menge Festplattenzugriffe.
    Andere Compiler müssen die Datei dann trotzdem öffnen um die include guards zu sehen.

    Ist also (IMHO) ein schönes feature vom VC++



  • Achso, also merkt der Compiler sich dass dort ein #pragma once vorkommt und öffnet sie nicht zweimal. Wenn er aber #pragma once nicht kennt trifft er auf die Include-Guards. Hab ich das jetzt richtig verstanden??? Deshalb also doppelt gemoppelt... Clever clever



  • MaSTaH schrieb:

    Achso, also merkt der Compiler sich dass dort ein #pragma once vorkommt und öffnet sie nicht zweimal. Wenn er aber #pragma once nicht kennt trifft er auf die Include-Guards. Hab ich das jetzt richtig verstanden??? Deshalb also doppelt gemoppelt... Clever clever

    Ganz genau!



  • Schade, dass es nicht Standard ist 😞

    Kann ja aber noch werden 🙂



  • Irgendwer schrieb:

    Schade, dass es nicht Standard ist 😞
    Kann ja aber noch werden 🙂

    braucht es nicht.
    gcc geht so vor, daß er include-guards erkennt und dann genauso effizient behandelt wie der andere die #pragmas. also die datei einfach nicht mehr aufmacht.
    ms könnte so nett sein, das auch zu lernen.



  • Hat gcc nicht auch mittlerweile ein pragma once? Ich benutze diesen COmpiler zwar nicht, aber bin der Meinung in einem GCC-Beispiel in den weitern des Webs sowas gesehen zu haben.

    In meinem VC++-Projekten benutze ich nur pragma once. Und wenn es der anderer Compiler nicht untertützt, hat dieser halt pech. 😉



  • Artchi schrieb:

    Hat gcc nicht auch mittlerweile ein pragma once? Ich benutze diesen COmpiler zwar nicht, aber bin der Meinung in einem GCC-Beispiel in den weiten des Webs sowas gesehen zu haben.

    kurz getestet:
    gcc-3.4.3 gibt mit -Wunknown-pragmas keine warnung bei der benutzung von #pragma once aus.

    mfg



  • volkard schrieb:

    Irgendwer schrieb:

    Schade, dass es nicht Standard ist 😞
    Kann ja aber noch werden 🙂

    braucht es nicht.
    gcc geht so vor, daß er include-guards erkennt und dann genauso effizient behandelt wie der andere die #pragmas. also die datei einfach nicht mehr aufmacht.
    ms könnte so nett sein, das auch zu lernen.

    Kann schon sein jedoch seh ich nicht den Sinn darin, dass man den Compilerbauern das Leben unnütz schwer macht (obwohl so schwer ist das erkennen von include guards eigentlich auch nicht). Jedenfals wird dadurch auch eine Fehlerquelle des Programmirers eleminiert. Bei include Guards muss man den Namen zweimal wiederholen. So wenn nun ein Tippfehler im Namen unterläuft. Dies ist ein Fehler der sich auch noch nicht sofort zeigt. Man muss ein Header wirklich zweimal includen damit es kracht. Dies kann dazuführen, dass man den Fehler erste lange Zeit nachdem man ihn gebaut hat entdeckt.



  • VS.NET verwendet übrigens keine include-Guards mehr. Dort steht in den generierten Headern nur noch #pragma once.



  • Wer holt eigentlich so alte Threads wieder hoch? 😃



  • ka 😃



  • in etwa wie die stdafx datein von vc++, obwohl sich das jeder selbst machen koennte ist es keine schlechte Idee diese standardmaeßig bei vc++ zu verwenden

    nicht das #pragma once keine gute Idee ist aber ich halte mich halt immer an KISS
    je mehr schluesselwoerter es gibt desto schlechter behaelt man ja den Ueberblick

    und der g++ compiler ist so schau und checkt das nur mit #ifdefs ob er eine datei nochmal angreift oder nicht?



  • MaSTaH schrieb:

    Wer holt eigentlich so alte Threads wieder hoch? 😃

    Ist doch geil? 😃



  • denk nicht, dass niemand weiß, wer du bist -- mods sehen alles 😉



  • @leo ich finde so ein

    #pragma once
    

    viel schöner und übersichtlicher als ein

    #ifndef XXX
    #define XXX
    //code
    #endif
    

Anmelden zum Antworten