globale Konstanten in namespace



  • Hallo, wieso krieg ich hier nen Linkerfehler?
    (Error: Unresolved external 'foo::bar' referenced from C:\TEMP\MAIN.OBJ)

    foo.hpp:

    namespace foo
    {
    extern const int bar;
    }
    

    foo.cpp

    namespace foo
    {
    const int bar = 25;
    }
    

    main.cpp

    #include "foo.hpp"
    #include <iostream>
    
    int main()
    {
    int x = foo::bar;
    
    std::cout<<x;
    return 0;
    }
    

    danke schon mal
    Martin


  • Mod

    weil const internal linkage impliziert (was der grund ist, warum man sie in header schreiben darf). du müsstest also in foo.cpp die .hpp ebenfalls einbinden.



  • Btw: ein einfaches const int bar = 25; im Header foo.hpp wäre hier völlig ausreichend. Kein Grund extra ein Objekt zu erzeugen.



  • oh mann,

    bitte hauts mir mit nem riesen Topf eine auf den Schädel.
    Wär da fast dran verzweifelt und dann sowas.
    Natürlich muss da ein include rein

    HumeSikkins schrieb:

    Btw: ein einfaches const int bar = 25; im Header foo.hpp wäre hier völlig ausreichend. Kein Grund extra ein Objekt zu erzeugen.

    in diesem Fall nicht, aber brauch die Werte in mehreren cpp-Dateien, nicht nur in main.

    Jedenfalls danke und sorry für die dumme Frage 🙂



  • anonymus schrieb:

    HumeSikkins schrieb:

    Btw: ein einfaches const int bar = 25; im Header foo.hpp wäre hier völlig ausreichend. Kein Grund extra ein Objekt zu erzeugen.

    in diesem Fall nicht, aber brauch die Werte in mehreren cpp-Dateien, nicht nur in main.

    Und das ist ein Problem, weil?

    Was spricht denn deiner Meinung nach gegen ein
    const int bar = 25; in foo.hpp und ein #include "foo.hpp" in jeder ÜE die den Wert von bar benötigt? Warum meinst du du bräuchtest extra ein Objekt?
    Benötigst du irgendwo die Adresse von bar?



  • kann mich dran erinnern, dass ich auf diese Weise schon mal nen schönen Fehler erzeugt hab (irgendwas mit mehrfacher Deklaration o. ä.)

    Offensichtlich hab ich damals irgendwas falsch gemacht...

    => bin überzeugt 🙂



  • Dann waren die Objekte damals nicht const. In dem Fall darf man sie nämlich nicht mehrfach inkludieren. C++-Sprache, schwere Sprache 🙂


Anmelden zum Antworten