Generische Programmierung



  • Hallo,

    habe mir in einer Header-Datei ein paar zeilen zusammengeschrieben, um je nach kompilierung std::cout oder std::wcout zu verwenden.

    #include <iostream>
    
    #ifdef UNICODE
    std::basic_ostream<wchar_t>& tcout = std::wcout;
    std::basic_ostream<wchar_t>& tcerr = std::wcerr;
    std::basic_ostream<wchar_t>& tclog = std::wclog;
    std::basic_istream<wchar_t>& tcin  = std::wcin;
    #else
    std::basic_ostream<char>& tcout = std::cout;
    std::basic_ostream<char>& tcerr = std::cerr;
    std::basic_ostream<char>& tclog = std::clog;
    std::basic_istream<char>& tcin  = std::cin;
    #endif
    

    Problem: wenn ich diese Datei mehrfach includiere, dann sagt der Linker logischerweise ständig, dass die Variablen schon ein paar mal in anderen Objektdateien vorkommen.

    Wie kann ich dieses Problem umgehen?
    Ist mein Ansatz für solche generischen cout/wcout geschichten soweit in Ordnung, oder würdet ihr das völlig anders machen?



  • Benutze im Header extern und nur die Deklaration. In einer CPP-Datei definierst du die Referenzen dann.



  • http://en.wikipedia.org/wiki/Include_guard
    koennte dir helfen.

    mfg,
    julian



  • #ifndef HEDAER_NAME
    #define HEADER_NAME

    //Hier header inhalt

    #endif



  • geht im header extern davor und in der *.cpp das ohne extern?
    edit: uih, bin ich langsam. 🙂



  • superman! schrieb:

    #ifndef HEDAER_NAME
    #define HEADER_NAME

    //Hier header inhalt

    #endif

    Leider nicht, das Problem liegt beim Linker.

    volkard schrieb:

    geht im header extern davor und in der *.cpp das ohne extern?

    Ja, sollte gehen. Man darf aber auch bei der Definition noch extern hinschreiben, soweit ich mich erinnern kann, ist es in gewissen Kontexten sogar nötig (wegen der Speicherklasse).

    Edit: @volkard: Post wahrscheinlich falsch aufgefasst. 🙂



  • Danke 🙂

    Das Problem waren übrigens nicht die "Include-Guards" sondern das Problem trat auf, wenn die Referenzen in verschiedene .cpp-Dateien includiert wurden.
    Das mit extern geht also 🙂


Anmelden zum Antworten