Definitionen in Namespaces?



  • Hallo,

    also ich habe gelernt, dass (Variablen) Definitionen in Headern böse sind, also man niemals sowas machen sollte:
    // foo.h
    int var;

    stattdessen besser:
    // foo.h
    extern int var;

    // foo.cpp
    int var;

    Aber wie ist das nun mit Namespaces?

    wenn ich nun habe:
    //bar.h
    namespace test {
    int var;
    }
    habe ich dann nicht das selbe Problem wie in foo.h mit var? Sind solche Definitionen in Namespaces schlecht?



  • Ein namespace beseitigt zwar das Problem der Namenskonflikte, das eigentliche Problem von globalen Variablen (können von überall, zu jeder Zeit, unüberwacht verändert werden) wird nicht beseitigt.



  • Meine Frage bezog sich eher auf den Linker Fehler. Wenn ich foo.h in 2 Übersetzungseinheiten inkludiere, gibts ja einen Linkerfehler. Hat man das selbe Problem mit Variablen Definitionen in Namespaces?



  • In Headerdateien deklariert man Variablen al extern oder static, je nach Verwendungszweck. Allerdings gibt es zumindest in C++ kaum wirkliche Einsatzbereiche für globale Variablen, deshalb sollte man sie - wie gesagt - aufgrund ihrer Schwächen einfach vermeiden.



  • namefrage schrieb:

    Meine Frage bezog sich eher auf den Linker Fehler. Wenn ich foo.h in 2 Übersetzungseinheiten inkludiere, gibts ja einen Linkerfehler. Hat man das selbe Problem mit Variablen Definitionen in Namespaces?

    Natürlich hast du dasselbe Problem mit Variablen in (benannten) Namespaces genauso. In unbenannten/anonymen Namespaces hast du das Problem nicht, dafür hast du dann viele verschiedene Variablen (eine Kopie pro Übersetzungseinheit).



  • Hm, wieso wird dann in bis jetzt jedem von mir gefundenen Namespace "Tutorial" eine Variable im Namespace angelegt?

    z.B. auch hier: http://tutorial.schornboeck.net/namespace.htm

    Das ist doch dann eigentlich richtig mieser Code?
    Wie macht man es dann richtig, wenn man eine globale Variable in einem Namespace braucht?



  • In dem Tutorial steht der Code in der .cpp Datei.
    Das Problem ist, dass bei #include die Definition immer textuell in jede inkludierende Datei kopiert wird. Ab 2 Dateien beschwert sich dann der Linker, weil du sie doppelt hast. In der .cpp beschwert er sich nicht, weil du sie natürlich nur einmal hast.

    Wie macht man es dann richtig, wenn man eine globale Variable in einem Namespace braucht?

    Gar nicht. Wenn du eine globale Variable brauchst, machst du es nicht richtig.
    Aber wenn du nur meinst, dass der Compiler sich nicht beschwert, das mit extern tuts auch im namespace.



  • namefrage schrieb:

    Wie macht man es dann richtig, wenn man eine globale Variable in einem Namespace braucht?

    Nenn mir mal bitte einen praktischen Anwendungsfall, in dem du meinst das du eine globale Variable brauchen würdest.


Anmelden zum Antworten