#pragma once



  • Ich wurde an einem anderen Ort darauf hingewiesen/implizit gefragt, ob dies als include-guard von jedem Compiler gefressen wird und C++ Standard ist.

    Sollte ich stattdessen lieber

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    
    
    
    #endif // HEADER_H_INCLUDED
    

    nehmen?



  • @lemon03 sagte in #pragma once:

    und C++ Standard ist.

    ne, #pragma once ist nicht Standart.



  • Ich wurde so gefragt. Kam mir auch komisch vor, warum eine Präprozessor Direktive was mit einem C++ Standard zu tun haben soll.

    Aber der Typ ist nicht doof. Also muss da was dahinterstecken.



  • Ich bin strenger Verfechter von #pragma once

    Hier abzulesen, dass "jeder" Compiler das unterstützt:
    https://en.wikipedia.org/wiki/Pragma_once#Portability

    Normale Include Guards können kollidieren oder werden exzessiv lang.



  • @5cript sagte in #pragma once:

    Normale Include Guards können kollidieren oder werden exzessiv lang.

    Dann kollodieren aber auch die Namen der Headerfiles (ausser sie haben bei #include unterschiedliche Ordner) und werden exzessive lang 😄 .

    @5cript sagte in #pragma once:

    https://en.wikipedia.org/wiki/Pragma_once#Portability

    Aber scheinbar kann es noch andere Vorteile haben und es geht schneller zum schreiben.



  • @lemon03 sagte in #pragma once:

    Kam mir auch komisch vor, warum eine Präprozessor Direktive was mit einem C++ Standard zu tun haben soll.

    Ähm. Guckst Du: 14 Preprocessing directives [cpp]



  • @titan99_ sagte in #pragma once:

    Dann kollodieren aber auch die Namen der Headerfiles (ausser sie haben bei #include unterschiedliche Ordner) und werden exzessive lang .

    Ich habe bevor ich überall auf pragma once umgestiegen bin folgenden Zusammenbau für Guards benutzt:
    PROJECT_PATH_FILENAME_INCLUDED

    1. Ich benutze "in jedem großen Projekt" die selben Header File Namen, in unterschiedlichen Ordnern.
    2. Brauchen meine Libraries auch einen eindeutigen Präfix.

    Und dann wirds schnell lang.



  • Also der einzige Compiler, der #pragma once nicht unterstützt, hat nicht mal einen Eintrag bei wikipedia?

    Damit kann ich leben.



  • Die Bezeichner werden nicht nur schnell lang, sie müllen auch den Makro-Namespace zu. Was dagegen hilft ist das INCLUDED vorne dranzustellen, also INCLUDED_TRALLALA statt TRALLALA_INCLUDED. Dann hat man wenigstens in der Makro-Liste in der IDE die ganzen Include-Guard Makros schön am Stück und kann sie einfach überspringen. Bzw. bekommt auch von Intellisense und ähnlichen Systemen kaum mehr unpassende Vorschläge durch die Trillionen von Include-Guards die sich in grossen Projekten so ansammeln.

    Also ja, #pragma once ist schon sehr praktisch.

    Der Grund warum es nicht standardisiert ist, ist AFAIK dass es schwierig ist plattformunabhängig zu definieren was nun das selbe File ist und was nicht. Da spielen u.A. so Sachen wie Mount-Points und Links mit rein.
    Und die Frage ist wie sinnvoll es wäre eine unvollständige "best effort" Definition in den Standard aufzunehmen.


Log in to reply