#include Guard vs #pragma once



  • Warum die ganze Diskussion!? Verwendet einfach beides und die Sache ist erledigt...

    Jonas OSDever schrieb:

    #define XXX_HEADER_INCLUDED__
    

    Kleiner Hinweis dazu: Wenn du deine Include Guards so benennst, ist dein Programm streng genommen UB. Laut Standard sind alle Namen, die einen doppelten Underscore beinhalten für den Compiler reserviert. In der Praxis wirst du damit kaum Probleme haben, aber ich würd mir einfach eine bessere Namenskonvention ausdenken... 😉


  • Mod

    dot schrieb:

    Warum die ganze Diskussion!? Verwendet einfach beides und die Sache ist erledigt...

    Wie man sieht ist das sehr Microsoft spezifisch. Beim GCC war es viel schneller, wenn man pragma once nicht benutzt. Also kann man argumentieren, man solle nur ifdef benutzen.



  • Ich steh nicht so auf Warnungen, daher ifdef.



  • Kann denn keiner hier eine klare Antwort geben, ich mache das nur als Hobby und habe mir warum auch immer leider eine klare Antwort erhofft?

    Um Speed geht es schon lange nicht mehr, sondern nur darum sich immer diese drei Zeilen zu sparen, auch wenn man portabel sein will im Sinne Windows/Linux und OSX.

    Macht #pragma once unter den gängigen Compiler(VC++, GCC) für Window/Linux/OSX das gleiche, also verhindert es dass diese Datei mehr als einmal genutzt wird?

    Ja/Nein?



  • Ja

    Nur wenn du deinen Code dann mal mit einem Compiler kompilieren willst, der #pragma once nicht unterstützt, wirst du dir wünschen, dass du dir die zwei Zeilen damals nicht gespart hättest...



  • dot schrieb:

    Warum die ganze Diskussion!? Verwendet einfach beides und die Sache ist erledigt...

    Jonas OSDever schrieb:

    #define XXX_HEADER_INCLUDED__
    

    Kleiner Hinweis dazu: Wenn du deine Include Guards so benennst, ist dein Programm streng genommen UB. Laut Standard sind alle Namen, die einen doppelten Underscore beinhalten für den Compiler reserviert. In der Praxis wirst du damit kaum Probleme haben, aber ich würd mir einfach eine bessere Namenskonvention ausdenken... 😉

    Ich dachte nur, wenn am Anfang ein oder zwei Underscores am Anfang 😕
    Ok, VAX-Snippet wird geaendert (ich hab zwar zusaetzlich noch #pragma once davor gepflanzt, aber der Doppel-Underscore war glaub ich schon Default bei VAX).



  • Jonas OSDever schrieb:

    dot schrieb:

    Jonas OSDever schrieb:

    #define XXX_HEADER_INCLUDED__
    

    Kleiner Hinweis dazu: Wenn du deine Include Guards so benennst, ist dein Programm streng genommen UB. Laut Standard sind alle Namen, die einen doppelten Underscore beinhalten für den Compiler reserviert. In der Praxis wirst du damit kaum Probleme haben, aber ich würd mir einfach eine bessere Namenskonvention ausdenken... 😉

    Ich dachte nur, wenn am Anfang ein oder zwei Underscores am Anfang 😕
    Ok, VAX-Snippet wird geaendert (ich hab zwar zusaetzlich noch #pragma once davor gepflanzt, aber der Doppel-Underscore war glaub ich schon Default bei VAX).

    Jo, sowas mit double Underscores machen offenbar viele IDEs per default, es ist dennoch nicht standardkonform. Hier der entsprechende Abschnitt:

    ISO/IEC 14882:2011 §17.6.4.3.2/1 schrieb:

    Certain sets of names and function signatures are always reserved to the implementation:

    • Each name that contains a double underscore _ _ or begins with an underscore followed by an uppercase letter (2.12) is reserved to the implementation for any use.
    • Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.

    Konservative Faustregel: Keine doppelten Underscores und keine Underscores am Anfang und du bist safe...



  • dot schrieb:

    Ja

    Nur wenn du deinen Code dann mal mit einem Compiler kompilieren willst, der #pragma once nicht unterstützt, wirst du dir wünschen, dass du dir die zwei Zeilen damals nicht gespart hättest...

    Ja, klar. Ist denn abzusehen dass in den nächsten Jahren da was kommen wird? Ihr kennt euch doch sicher aus und wisst ob da irgendwo heftig geackert wird. Son Compiler in der Größenordung VC,GCC schüttelt man bestimmt nicht mal überraschend aus dem Ärmel und wenn wie groß ist dann die Wahrscheinlichkeit dass man dann noch #pragma once nicht mit einbaut?



  • clang wird kommen bzw. ist schon da und der unterstützt #pragma once auch. Die Frage ist, ob du eben wirklich jemals und für alle Zeit nur auf den 3-4 großen Compilern laufen musst...



  • Ja hast recht meine Software wird mal so toll, dass ich sie in Jahren noch weiter pflegen werde und ich sie daher auch für die nächsten großen Compilern kompatibel halten muss.^^ Mit dem Gedanken werden ich nun deine Include-Methode verwenden und später in einem Interview sie als dot-Methode positiv erwähnen^^

    Na dann werde ich mal wieder was schaffen, so viel habe ich heute noch nicht abgehakt.

    Danke euch allen für die Kommentare und verzeiht mir meine absichtlich provokanten Fragen und Antworten.



  • Ich sag ja nur, was kostet es schon, drei Zeilen mehr zu schreiben!?

    Wenn ich z.B. MSVC spezifischen Code hab, verwend ich persönlich auch manchmal einfach nur #pragma once. Wenn ich Code hab, der portabel sein soll, dann verwend ich eben beides. Wenn es dir so sehr auf die beim Tippen vergeudete Zeit ankommt, dann überleg mal, wie viele Include Guards du in der Zeit, die du hier rumdiskutiert und auf Antworten gewartet hast, hättest tippen können...



  • Ist ja richtig, nur warte ich hier nun nicht unbedingt auf die Antworten, da habe ich besseres zu tun^^

    Im Moment ärgere ich mich immer mehr über die Visual Studio IDE, kein Header/Source Switch, kein Kommentar-toggle und einige andere Sachen. Das kann der Qt-Creator wesentlich besser, den habe ich nämlich gerade mal getestet und das ist ja ein Traum im Vergleich zu VisualStudio.

    Eine Lib unterstützt leider DirectX welches nicht von den MinGW directx headern unterstützt wird, aber dann muss kann ich erst mal auf das Standarddevice ausweichen.



  • Butterbrot schrieb:

    Im Moment ärgere ich mich immer mehr über die Visual Studio IDE, kein Header/Source Switch, kein Kommentar-toggle und einige andere Sachen.

    Also ich weiß ja nicht welche Version von Visual Studio du verwendest, aber Kommentar Toggle (Text Editor Toolbar, Ctrl + K + C/ Ctrl + K + U) und Header/Source Switch (Rechtsklick im Editor) gibts in VS natürlich...



  • Bei einem Kommentar-Toggle drückt man immer die gleiche Taste Bsp, Ctrl+/, das geht viel schneller, genau wie beim Umschalten zwischen Header und Source mit F3. Und es ist nicht nur das, die ganze IDE ist extrem gut durchdacht. Sie musste ja auch nicht auf irgendwelche alten Versionen Rücksicht nehmen und man merkt das leider bei VS an allen Ecken. Wer einmal vom Qt-Creator( oder auch andere IDEs) mit den Features verwöhnt wurde, will nix anderes mehr^^

    Aber ist wie so vieles eine Frage des Geschmacks und auch nicht Thema dieses Threads.



  • Du kannst doch einfach beim VS die Tastaturbelegung ändern (Tools/Customize -> Keyboard).



  • Es gibt schlicht weg keinen Toggle für Kommentare oder Header/Source-Switch. Da es diese Funktionen nicht gibt, kann ich sie auch keiner Taste zuweisen. Dieses "gehe zur Definition" etc. oder zwei verschiedene Funktionen für Kommentar setzten und entfernen ist wirklich ziemlich umständlich, wenn man es einmal anders gesehen hat.

    Beim Creator drückst du einfach eine Taste und guckst damit kurz in den Header oder Source, je nach dem wo du gerade bist und mit der gleichen Taste, ohne neu auf der Tastatur suchen zu müssen oder gar zur Maus zu wechseln, kommst du wieder zurück. Genauso ist es mit dem Kommentieren und Auskommentieren.

    Ich habe mir jetzt mal Codelite angeschaut, da ist es auch gleich out-of-the-box also zusammen:
    - Kommentar Toggle
    - Header/Source Toggle
    - Git
    - Doxygen
    - Snippets
    - Plugins
    - easy Vorlagen-/Templateerstellung
    - Refaktoring
    Alles da und dazu noch kostenlos, was will man mehr. Für Standardgeschichten muss man VS mit Plugins zuschütten die teilweise nicht mal kostenlos sind, einiger der Features bringt z.b Visual-Assist und jetzt ist mir auch klar warum das so beliebt.

    Das Kommentar-Toggle hat übrigens Eclipse auch, ist also wirklich eine Art Standard.

    Vielleicht bleibe ich sogar bei Codelite mit wxWidgets, mal schauen. Man hat ja Zeit und kann viel rumprobieren und sich in Ruhe dann für das Beste entscheiden.



  • dot schrieb:

    Ja

    Nur wenn du deinen Code dann mal mit einem Compiler kompilieren willst, der #pragma once nicht unterstützt, wirst du dir wünschen, dass du dir die zwei Zeilen damals nicht gespart hättest...

    Ist ja jetzt nicht so schwer über alle Header-Dateien zu iterieren, das #pragma once durch #ifndef...\n#define zu ersetzen und hinter die letzte Zeile noch ein #endif zu hängen.



  • dot schrieb:

    [...] aber Kommentar Toggle (Text Editor Toolbar, Ctrl + K + C/ Ctrl + K + U)[...]

    Es ist aber umständlich und schlecht gelöst. Ich benutze einen echt einfachen Texteditor (scite) und der hat den besten Kommentartoggle den ich jemals gesehen hab (bis auf die standardtastenbelegung...lol):

    strg+Q(!!!) erzeugt, sofern es nicht vorhanden ist, als kommntar so etwas wie //~ und ein erneuter Tastendruck entfernt es. Auf diese Artt kann man nicht ausversehen Kommentare entfernen, weil die keine Tilde haben. Das heißt wenn man sowas hat:

    //kommentar
    code
    code
    

    macht ein Toggle daraus:

    //~//kommentar
    //~code
    //~code
    

    und nicht

    kommentar
    //code
    //code
    

    wie bei anderen IDEs mit Toggle. Das Empfinde ich schon als maximal hübsch.
    //edit und im Vergleich zum VC mit den zwei umständlichen Tastenkombinationen, kann man bei einem toggle nicht add und remove verwechseln.



  • otze schrieb:

    und nicht

    kommentar
    //code
    //code
    

    Das Problem hast du bei der VC Variante halt nicht... 😉

    Aber lassen wir das, ich bestreite ja nicht, dass Visual Studio nicht unbedingt den besten Editor aller IDEs hat. Find ich persönlich aber ehrlich gesagt auch nicht so wichtig wie andere Dinge. Ich verbring nur einen relativ kleinen Teil meiner Zeit damit, tatsächlich Code zu schreiben...

    Edit: Ok, hab vorhin net ganz gecheckt was du gemeint hast, das Problem hast du in VC natürlich auch...


Anmelden zum Antworten