Kleine Frage: "Include-Wächter"



  • Man sieht beides, aber was ist nun "richtig", oder wo ist der Unterschied?

    #ifndef _BLA_H_
    #define _BLA_H_
    
    ...
    
    #endif _BLA_H_
    

    und

    #ifndef _BLA_H_
    #define _BLA_H_
    
    ...
    
    #endif //_BLA_H_
    

    😕



  • Der Unterschied ist dass ersteres eigentlich nicht gültig ist, aber von vielen Compilern toleriert wird 😉



  • Der Unterstrich beim Makronamen sollte auch unterlassen werden. Unterstriche als Prefix bleiben inoffiziell den Compiler-Herstellern überlassen.



  • Aha, danke!
    Also richtig wäre dann:

    #ifndef BLA_H
    #define BLA_H
    
    #endif
    

    Unterstriche zwischen den Namen sind ja erlaubt!?



  • Artchi schrieb:

    Der Unterstrich beim Makronamen sollte auch unterlassen werden. Unterstriche als Prefix bleiben inoffiziell den Compiler-Herstellern überlassen.

    Nicht nur inoffiziell!



  • Ob sie sogar offiziell den Herstellern vorbehalten sind, weiß ich nicht. Weiß nicht ob es im Stroustrup drin steht.

    @ceplusplus! Unterstriche sind im Namen natürlich erlaubt. Nur halt nicht als Prefix.



  • Siehe Standard

    17.4.3.1.2 Global names
    1
    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.11) 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.



  • LordJaxom schrieb:

    Der Unterschied ist dass ersteres eigentlich nicht gültig ist, aber von vielen Compilern toleriert wird 😉

    Denke, tolerieren ist hier garnicht nötig, denn _BLA_H wird ja oben definiert und vom Präprozessor in Wärme umgewandelt ;). Drum beide Versionen hier praktisch gleichbedeutend ...



  • Meines wissens darf nach der Präprozessoranweisung #endif strenggenommen nichts mehr stehen. Der "Fehler" ist also beim Präprozessorlauf und nicht bei der Compilierung. Zu dem Zeitpunkt ist das Makro also noch nicht vom Präprozessor ersetzt 😉

    GCC gibt ne Warnung "trailing characters after #endif"


Anmelden zum Antworten